首页 > 解决方案 > Laravel 无法识别控制器 __invoke()

问题描述

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

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

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

Route::get('/', function () {
    return view('welcome');
});

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

来自 web.php:

Route::get('/test', TestController::class);

测试控制器.php:

<?php

namespace App\Http\Controllers;

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

标签: phplaravelroutescontroller

解决方案


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

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

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

Route::get('/test', TestController::class);

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

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

推荐阅读