PHP7.2 とcrud4.4.4でエラーで困ったことをメモっておき解決した結果メモ
前回の続きです
(
PHP7.2の環境で、既存プロジェクトの横展開で新しいサービスを対応したときに躓いたのでメモ①)
エラーログから、PHP7.2とcrud4.4.4のバージョンが合わないということで一旦、PHP7.1にダウングレードしてその場限りを乗り越えたところから。
PHP7.1にダウングレードしたけれども、セキュリティーアップデートも2019/12/01に終了することからこのままでいいわけがありません。
ということでまずはローカル環境で動作を確認してPHP7.2に対応させていきましょう!
PHP7.2(cakePHP3.4 apache2.4)
node.js
mysql5.7
という環境をまずはdockerで再現して動作確認をしてみることに。。
ということでまずはまんまと出ました前回のエラーです
PHP Fatal error: Cannot use Crud\\Core\\Object as Object because 'Object' is a special class name in /var/www/html/vendor/friendsofcake/crud/src/Listener/BaseListener.php on line 4, referer: http://domein
調べるとPHP7.2だとcrudのバージョンが5だとな
composer記載のcrudが以下なので
"friendsofcake/crud": "~4.3",
こちらに変更
↓↓↓↓↓
"friendsofcake/crud": "^5.0",
してみました
ちなみに、PHP7.1のままCRUDをバージョン5にするとこんなエラーが出ました
# composer update crud
Problem 1
- The requested package friendsofcake/crud (locked at 4.4.4, required as ^5.0) is satisfiable by friendsofcake/crud[4.4.4] but these conflict with your requirements or minimum-stability.
いまのバージョンで問題ないよ、5にすると矛盾が発生するよ?って感じですかね
アップデートできません。。。
ちょっと興味本位の実験はおいておきまして、これで
# composer update
を実行
つらつらと今までアップデートをしていないというところでいろんなものがアップデートをされていきます・・・
これで解消してくれと祈るようにアクセス!
そうすると今度はこんなエラーが。。。Call to undefined method Core\Controller\Api\RoomsController::getEventManager() in /var/www/html/vendor/friendsofcake/crud/src/Controller/Component/CrudComponent.php on line 142
正確にはわからないんですがcakePHPのバージョンが合わないのかなと思い。。
https://book.cakephp.org/3.0/ja/core-libraries/events.html
バージョン 3.5.0 で撤廃: 代わりに getEventManager() を使用してください。
このページのこのくだりかななんて想像しております
とりあえずmethodが無いようなのでcakePHP3.7まで上げてみました
すると今度はこのエラーです。。
==> /var/log/httpd/access_log <==
"OPTIONS /api/1 HTTP/1.1" 200 612998 "http://domain"
こちらはcakePHPのエラーログ
==> /var/www/html/logs/error.log <==
Warning: Warning (512): Unable to emit headers. Headers sent in file=/var/www/html/vendor/cakephp/cakephp/src/Error/Debugger.php line=853 in [/var/www/html/vendor/cakephp/cakephp/src/Http/ResponseEmitter.php, line 48]
このエラーが原因だと思われる
んでPOSTMANでたたくとこれが出ていた
<pre id="cakeErr5ca2da8cd71bd-context" class="cake-context" style="display: none;">$message = 'Security::salt() is deprecated. Use Security::getSalt()/setSalt() instead. - /var/www/html/config/bootstrap.php, line: 157
You can disable deprecation warnings by setting `Error.errorLevel` to `E_ALL & ~E_USER_DEPRECATED` in your config/app.php.'
※省略しています
非推奨のエラーが出ているんでなかろうかとおもう
そして書いてある通りに非推奨のエラーを抑制してみる
config/app.phpのエラーのセクションを以下に変更
E_ALL & ~E_USER_DEPRECATED
でもまだエラー
そしてエラーの様子がおかしい。
$this->request->is(“options”)
を利用しているところで、Response::is()が定義されてないといわれている
定義されているんですよ、IDEでメソッドリンクしてるし!!
あるわけないじゃん!!と思いながら困惑気味。。
2019-04-02 12:33:03 Error: [Error] Call to undefined method Cake\Http\Response::is()
でprint_r($this->request, true)してみんです。。
2019-04-02 19:20:13 Error: Cake\Http\Response Object
(
[status] => 200
[contentType] => text/html
[headers] => Array
(
[Content-Type] => Array
(
[0] => text/html; charset=UTF-8
)
[Access-Control-Allow-Origin] => Array
(
[0] => *
)
これなんですがわたしの悪さでした。。
本来エラーの出ているメソッドは
$this->request->is('options');
何ですよ。。
だけどエラーもインスタンス自体のdumpもresponseになっています。
はぅ!!!!
そもそもの対応は
$this->response->corsのbuild()メソッドの処理が
return $this->_response;
にcakePHP3.4はなっていたのですが
cakePHP3.6以降から
https://book.cakephp.org/3.0/ja/controllers/request-response.html
こちらにある通り
ヘッダーの設定は Cake\Http\Response::withHeader() メソッドで行われます。 すべての PSR-7 インターフェイスのメソッドと同様に、このメソッドは新しいヘッダーを含む 新しい インスタンスを返します。
ということで新しいインスタンスを返却しているので
build()メソッド内でwithHeader()を利用することになっているので、
$this->response->cors($this->request)
->allowOrigin(['*'])
->allowMethods(['*'])
->allowHeaders(['content-type'])
->allowCredentials(['true'])
->exposeHeaders(['Link'])
->maxAge(300)
->build();
これで利用できていたのを、cakePHP3.7にあげたことにより
新しいインスタンスを受け取るように修正しました
$this->request = $this->response->cors($this->request)
->allowOrigin(['*'])
->allowMethods(['*'])
->allowHeaders(['content-type'])
->allowCredentials(['true'])
->exposeHeaders(['Link'])
->maxAge(300)
->build();
間違えちゃいました。。。
新しいインスタンスはresposeのインスタンスなのにrequesutを上書きしちゃってるんですよ。。。
本当は$this->responseを上書きしなきゃいけないんですよ
私ってばおばか。。。
ということでこれで解決!!!!
アクセスOKでございます
でも非推奨のメソッドを使っているところもなおしていかないとならんですね!!
コメント
コメントを投稿