デバッグメモです。
レアケースかもですが、同じようなエラーに悩む方に届きますように…!
Laravelにて新規フォームを作成中
「よし!ローカル環境実装できた!開発環境に上げて確認するぞ~」
「・・・あれ???」
1. 開発環境でエラー発生・・・
フォームテストでエラーになってしまいました。
ログも出ない!なんてこともたまにあるのですが今回は幸いにもエラーログを吐いていたので、
出力されたログを確認すると下記のようなエラーが・・・
[2019-06-03 19:02:49] development.ERROR: Class App\Http\Requests\HogeHogePost does not exist {"exception":"[object] (ReflectionException(code: 0): Class App\\Http\\Requests\\HogeHogePost does not exist at /xxx/hogehoge.jp/vendor/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php:25, ParseError(code: 0): syntax error, unexpected ')' at /xxx/hogehoge.jp/app/Http/Requests/HogeHogePost.php:37)
「どうやらHogeHogePostクラスが見つからないよ~」と言われているようです。
クラスが見つからないということなので真っ先にvendor/composer/autoload_classmap.phpファイルの不備を疑い、下記コマンドを叩いてみましたが、結果は変わりませんでした。
composer dump-autoload
Laravelで新たに名前空間を追加した際は、ここにクラスあるよ!という情報をクラスマップに定義してあげる必要があります。
ですがvendor/composer/フォルダやcomposer.jsonファイルの差分を見て差異がないところを見ると、composerは今回関係ないかもしれない。。。
2. クラスマップの問題ではないとすると、問題はソースの方???
一旦頭を切り替え、ログに「syntax error, unexpected ')' ~app/Http/Requests/HogeHogePost.php:37 (37行目に構文エラーあるぞ~)」とあったので改めてapp\Http\Requests\HogeHogePost.phpを見てみることにしました。
すると
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return array_merge(
$this->nameKanaRules(),
$this->devidedPhoneNumRules(),
$this->phoneNumRules(),
$this->appointTimeRules(), //カンマ!!!!
); //37行目
}
これかあああああああ
はい、関数呼出し引数の末尾にカンマをつけてしまっていたのが原因ですね
なぜローカル環境ではエラーが出なかったかというとローカル環境と開発環境のPHPバージョンに差異があり、その間に引数末尾のカンマを許容する新機能が追加されたことが原因でした。
(ローカル環境:PHP 7.3.2, 開発環境:PHP 7.2.13)
下記PHP公式のリリースノートです。
https://wiki.php.net/rfc/trailing-comma-function-calls
配列を扱うときの癖で末尾にカンマをつけてしまっていましたが、引数末尾にもカンマを付けられるようになったのは最近だったようです。
PHP歴が浅いこともあり全く気がつきませんでした。
末尾のカンマを取り、無事エラーは発生しなくなりました。(いや〜、本番環境じゃなくてよかった。。。)
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return array_merge(
$this->nameKanaRules(),
$this->devidedPhoneNumRules(),
$this->phoneNumRules(),
$this->appointTimeRules() //エラー解消
);
}
3. まとめ
これまで環境の違いによるエラーに出会うときはほとんどgit管理されていないファイルが原因で起きていたのですが、今回のようにファイルは同一であっても言語のバージョンが異なることでエラーが発生してしまうこともあります。
念のためPHPのリリースノートを一通りチェックしておこうと思います。