Laravel:不掌握__invoke方法吗?

时间:2019-08-14 20:12:37

标签: php laravel

尝试使用可调用控制器,但似乎找不到__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');
    }
}

5 个答案:

答案 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');