⛳
【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']);
教訓
シングルアクションコントローラーを指定する際にも、ルーティングは配列指定で書いた方が良い。
-
シングル(単一)アクションコントローラと呼ばれる ↩︎
Discussion