Laravel 无法识别控制器 __invoke()

Mik*_*e C 5 php controller routes laravel

尽管浏览了几个类似的帖子,但无法调试这个简单的路由问题。

TestController是不可调用的。控制器类 TestController 不可调用。您是否忘记添加 __invoke 方法,或者您的路由文件中缺少控制器的方法?

我在 Stack 上尝试过尽可能多的排列,但没有任何改变。我已经确认了简单的路由,即:

Route::get('/', function () {
    return view('welcome');
});
Run Code Online (Sandbox Code Playgroud)

有效,但我无法让控制器工作。我已经清除了缓存并取消了 $namespace 的注释,没有什么区别。事实上,错误消息似乎没有改变,这让我相信这不是路由问题,而是与控制器有关。但我是个新手,没有看到它。

来自 web.php:

Route::get('/test', TestController::class);
Run Code Online (Sandbox Code Playgroud)

测试控制器.php:

<?php

namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    
    class TestController extends Controller {
        public function __invoke() {
            return view('welcome');
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 6

也许这对像我这样的人有帮助,他们忽略了一个简单的问题:我写道:

Route::post('controller/{resource}/action', \App\Http\Controllers\MyController::class, 'action')->name('controller.action');
Run Code Online (Sandbox Code Playgroud)

相反,我需要的是:

Route::post('controller/{resource}/action', [\App\Http\Controllers\MyController::class, 'action'])->name('controller.action');
Run Code Online (Sandbox Code Playgroud)

所以基本上我错过了[]控制器类和操作参数,它们放在一个数组中 - 必须记住这一点。:)

抱歉,如果它有点偏离主题,但我搜索了我的问题并最终来到这里,因此这也可能对其他人有帮助。


Don*_*ash 5

当您没有控制器的 FQCN 的 use 语句时,通常会发生这种情况。

在声明路由的路由文件中,确保添加了 Controller 命名空间的 use 语句。特别是自 Laravel 8.x 以来,控制器的默认命名空间并未设置为App\Http\Controllers与早期版本不同。

//routes file
use App\Http\Controllers\TestController;

Route::get('/test', TestController::class);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您使用可调用的控制器类仅返回视图,则可以使用 Route::view() 方法

//Assuming that you have a resources/views/test.blade.php 
Route::view('/test', 'test');
Run Code Online (Sandbox Code Playgroud)