0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelでPHP8にバージョンアップしたらcallActionでエラー

Last updated at Posted at 2021-02-07

Laravelのバージョンは8.9.0でPHPを7→8にバージョンアップしたときに出たエラーの解消方法をメモ。
以下のようなエラーが出ました。

Error
Unknown named parameter $kind

該当行は vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54Controller.phpcallAction メソッドで発生している模様。

/**
 * 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));
}

$parameterscallAction 関数に渡す前に array_values で通常の配列にして渡してあげます。
array_values 関数で変換すると以下のような配列を渡すことになります。

array(1) { [0]=> string(1) "1" }

これはいずれLaravel側が改修するのかな?その時はまた修正しないとなー。
とりあえず解決。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?