TL;DR
这样做:
use App\Http\Controllers\PortfolioController;
Route::get('/portfolio', PortfolioController::class)->name('portfolio');
^^^^^^^^^^^^^^^^^^^^^^^^^^
解释
在 Laravel 8 之前,路由被命名为RouteServiceProvider.php
:
protected $namespace = 'App\Http\Controllers';
// ...
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace) // <----
->group(base_path('routes/web.php'));
}
因此,当您定义路线时,如您的示例所示:
Route::get('/portfolio', 'PortfolioController')->name('portfolio');
^^^^^^^^^^^^^^^^^^^^^
The PortfolioController
字符串的命名空间为App\Http\Controllers
.
然而,从 Laravel 8 开始,这种行为已经被修改。来自v8 发行说明:
在 Laravel 8.x 中,这个属性是null
默认情况下。这意味着没有
自动命名空间前缀将由 Laravel 完成。因此,在
新的 Laravel 8.x 应用程序,控制器路由定义应该是
使用标准 PHP 可调用语法定义:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
现在,对于你提到的具体情况,__invoke()
方法,这就是你应该如何处理它们根据文档:
为单一动作控制器注册路由时,不需要
指定一个方法:
use App\Http\Controllers\ShowProfile;
Route::get('user/{id}', ShowProfile::class);