どういうことか
(PHPStormの型補完機能を使って型宣言をしたら、地味にエラーにハマったのでメモです。)
Laravelプロジェクトをインストールしたら、初めから様々なClassが作成されていると思います。
例えば、
Http/Middleware/EncryptCookies.php
というClassが既に存在していたりするのですが、このClassでは
$except
という変数が定義されています。
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
//
];
}
PHPStormのような補完機能のあるエディタを使っていたら、
「$except
に型宣言がされてませんよ!」と警告されてしまうことがあって少々鬱陶しいので、
つい補完機能を使ってarray
の型宣言をつけてしまったことがありました。
しかし、これがエラーを招く原因に。。
何が起きたか
変数$except
に、arrayの型宣言をつけたことで、実は見えないところでも変化が起きていました。
クラスEncryptCookies.php
は、
Illuminate\Cookie\Middleware\EncryptCookies
を継承しているのですが、
この継承元のクラスの方にも$except
という変数が定義されています。
つまり、$except
はオーバーライドされていたわけなのですが、オーバーライドしている方の
$except
にPHPStormの補完機能でarrayの型宣言をつけてしまった結果、
なんと継承元(親)の$except
の方にもarrayの型宣言がされてしまっていたことがわかりました。😓
継承元の、Illuminate\Cookie\Middleware\EncryptCookies
継承元のIlluminate\Cookie\Middleware\EncryptCookies
の方は、
vendor配下でgitの管理外でもあるから変化に気付きにくい。。。
ローカルで動かしている分には、問題なくアプリも動作するのですが、問題はサーバー等にデプロイした時です。
500エラーが発生
プライベートで開発しているアプリをAWSにデプロイしたらエラーが。。
エラーログを見てみると。。
local.ERROR: Type of App\Http\Middleware\EncryptCookies::$except must not be defined (as in class Illuminate\Cookie\Middleware\EncryptCookies) {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 64): Type of App\\Http\\Middleware\\EncryptCookies::$except must not be defined (as in class Illuminate\\Cookie\\Middleware\\EncryptCookies) at /var/www/html/laravel/app/Http/Middleware/EncryptCookies.php:7)
[stacktrace]
#0 {main}
どうやら、
Http/Middleware/EncryptCookies.php
の変数$except
(オーバーライドしてる方)に、
arrayの型宣言をするな!と怒られているようです。
原因:
サーバー側の方では、Http/Middleware/EncryptCookies.php
が継承している、
親のIlluminate\Cookie\Middleware\EncryptCookies
(vendor配下)の中に定義されている
$except
にはarrayの型宣言なんてされていないので、
オーバーライドした方の$except
で型宣言したらエラーが発生してしまっていました。😇
→ gitの管理外のClassなので、ローカルの方で書き換えられててもサーバー側には反映されませんよね..
結論
Laravelに初めからある変数やメソッドは、オーバーライドされているものの可能性があるので
むやみに型宣言しない方が良い😇