【Laravel】Invalid route action: [App\Http\Controllersが勝手に付与される

に公開

問題

例えばLaravel Modulesなどを使って、外部Controller@__invoke[1]を指定する際

Route::get('/users', \Modules\User\UserController::class);

App\Http\Controllersを指定していないのに勝手に付与されて、エラーが出てしまう。

Invalid route action: [App\Http\Controllers\Modules\User\UserController]

原因

RouteServiceProvider::$namespaceが指定されていないか確認する。

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';
// 略
}

指定されていた場合、Laravel側でRouteServiceProvider::$namespaceを付け足していることが原因。

解決方法

ルーティングを配列指定で書くと、RouteServiceProvider::$namespaceが付け足されなくなる。

Route::get('/users', [\Modules\User\UserController::class, '__invoke']);

教訓

シングルアクションコントローラーを指定する際にも、ルーティングは配列指定で書いた方が良い。

脚注
  1. シングル(単一)アクションコントローラと呼ばれる ↩︎

株式会社フーリエ

Discussion