尝试使用可调用控制器,但似乎找不到__invoke方法吗?
Invalid route action: [App\Http\Controllers\App\Http\Controllers\MainController].
似乎在以下位置返回了真值:
if (! method_exists($action, '__invoke')) {
throw new UnexpectedValueException("Invalid route action: [{$action}].");
}
路线:
<?php
Route::get('/', \App\Http\Controllers\MainController::class);
MainController:
<?php
namespace App\Http\Controllers;
class MainController extends Controller
{
public function __invoke()
{
dd('main');
}
}
答案 0 :(得分:1)
默认情况下,Laravel假定您的控制器位于App\Http\Controllers\
。因此,当您向控制器添加完整路径时,Laravel会在App\Http\Controllers\App\Http\Controllers\MainController
处进行检查。
要解决该问题,只需在注册路由时删除名称空间,然后像这样注册它:
Route::get('/', MainController::class);
或者,您可以通过从->namespace($this->namespace)
文件夹中的mapWebRoutes()
类的RouteServiceProvider
方法中删除App\Providers
来停止此行为。然后,您可以像这样注册您的路线:
Route::get('/', \App\Http\Controllers\MainController::class);
答案 1 :(得分:1)
或者,您可以使用:
Route::get('/', [\App\Http\Controllers\MainController::class, '__invoke']);
在这种情况下,将不考虑namespace
中提供的RouteServiceProvider
。
这样做的好处是现在您的IDE将能够引用该类的用法,并且可以通过单击它进行导航。
答案 2 :(得分:1)
对每个人都有效的最佳答案是 Laravel 文档。
如果(websiteController 是控制器的名称),只需在路由的顶部使用它(web.php)
use App\Http\Controllers\WebsiteController;
并为您的索引页面定义这样的路线
Route::get('/', [WebsiteController::class, 'index']);
注意
[ ]
答案 3 :(得分:0)
将路线更改为:
Route::get('/', "MainController");
答案 4 :(得分:0)
在我的情况下,我忘记设置@action,因此请从以下位置更改代码:
Route::get('admin/orders', 'Admin\OrderController')->name('admin.orders');
收件人:
Route::get('admin/orders', 'Admin\OrderController@index')->name('admin.orders');