Laravelのバージョンは8.9.0でPHPを7→8にバージョンアップしたときに出たエラーの解消方法をメモ。
以下のようなエラーが出ました。
Error
Unknown named parameter $kind
該当行は vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
で Controller.php
の callAction
メソッドで発生している模様。
/**
* Execute an action on the controller.
*
* @param string $method
* @param array $parameters
* @return \Symfony\Component\HttpFoundation\Response
*/
public function callAction($method, $parameters)
{
return call_user_func_array([$this, $method], $parameters); // ←ここでエラーが起こってる
}
どうもコールバック関数をコールする call_user_func_array
関数で渡す配列 $parameters
の形式に問題がありそうで探ってみた。
callAction
メソッドの $parameters
をダンプすると以下のような内容でした。
array(1) { ["kind"]=> string(1) "1" }
PHP7での call_user_func_array
は配列のkeyが無視されていたので問題なかった様子。PHP8になって名前付き引数が追加されたためkeyが無視されなくなってしまったため起こったエラーのようです。
これにより呼び出された側の引数で、kindという名前の引数が用意されていないため、 Unknown named parameter $kind
のエラーが出ていたようです。
そこで、名前付き引数でない配列を渡すように子クラスで親クラスの callAction
をオーバーライドすることにしました。親クラスのメソッドを直接変更してもいいのですが、フレームワークは直接さわらないのは暗黙の了解で。
public function callAction($method, $parameters)
{
return parent::callAction($method, array_values($parameters));
}
$parameters
を callAction
関数に渡す前に array_values
で通常の配列にして渡してあげます。
array_values
関数で変換すると以下のような配列を渡すことになります。
array(1) { [0]=> string(1) "1" }
これはいずれLaravel側が改修するのかな?その時はまた修正しないとなー。
とりあえず解決。