LoginSignup
3
2

More than 1 year has passed since last update.

Laravelに初めからある変数やメソッドには、むやみに型定義しない方が良い

Last updated at Posted at 2021-07-17

どういうことか

(PHPStormの型補完機能を使って型宣言をしたら、地味にエラーにハマったのでメモです。)

Laravelプロジェクトをインストールしたら、初めから様々なClassが作成されていると思います。
例えば、
Http/Middleware/EncryptCookies.php
というClassが既に存在していたりするのですが、このClassでは
$exceptという変数が定義されています。

EncryptCookies.php
<?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の型宣言をつけてしまったことがありました。
しかし、これがエラーを招く原因に。。

image.png

補完機能で、ついarrayの型宣言をしてしまった↓
image.png

何が起きたか

変数$exceptに、arrayの型宣言をつけたことで、実は見えないところでも変化が起きていました。

クラスEncryptCookies.phpは、
Illuminate\Cookie\Middleware\EncryptCookies を継承しているのですが、
この継承元のクラスの方にも$exceptという変数が定義されています。

つまり、$exceptはオーバーライドされていたわけなのですが、オーバーライドしている方の
$exceptにPHPStormの補完機能でarrayの型宣言をつけてしまった結果、
なんと継承元(親)の$exceptの方にもarrayの型宣言がされてしまっていたことがわかりました。😓

継承元の、Illuminate\Cookie\Middleware\EncryptCookies
image.png

継承元のIlluminate\Cookie\Middleware\EncryptCookiesの方は、
vendor配下でgitの管理外でもあるから変化に気付きにくい。。。

ローカルで動かしている分には、問題なくアプリも動作するのですが、問題はサーバー等にデプロイした時です。

500エラーが発生

プライベートで開発しているアプリをAWSにデプロイしたらエラーが。。
image.png

エラーログを見てみると。。

 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に初めからある変数やメソッドは、オーバーライドされているものの可能性があるので
むやみに型宣言しない方が良い😇

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2