Trying to use invokable controllers, but it seems to fail to find the __invoke method?
JavaScript
x
Invalid route action: [AppHttpControllersAppHttpControllersMainController].
It seems to be returning true on:
JavaScript
if (! method_exists($action, '__invoke')) {
throw new UnexpectedValueException("Invalid route action: [{$action}].");
}
Routes:
JavaScript
<?php
Route::get('/', AppHttpControllersMainController::class);
MainController:
JavaScript
<?php
namespace AppHttpControllers;
class MainController extends Controller
{
public function __invoke()
{
dd('main');
}
}
Advertisement
Answer
Laravel by default assumes that your controllers will be located at AppHttpControllers
. So when you’re adding the full path to your controller, Laravel will check it there, at AppHttpControllersAppHttpControllersMainController
.
To solve it simply remove the namespace when you’re registering the route, and register it like this:
JavaScript
Route::get('/', MainController::class);
Alternatively, you can stop this behavior by removing ->namespace($this->namespace)
from mapWebRoutes()
method on RouteServiceProvider
class, which is located at AppProviders
folder. Then you can register your routes like this:
JavaScript
Route::get('/', AppHttpControllersMainController::class);