我正在使用Laravel 8,当我编写到__invoke
控制器的路由时,如下所示:
use App\Http\Controllers\PortfolioController;
Route::get('/portfolio', 'PortfolioController')->name('portfolio');
它显示了这个错误:
无效路由操作: PortfolioController。
PortfolioController
是不可调用的
所以它只能这样工作:
Route::get('/portfolio', [PortfolioController::class, '__invoke'])->name('portfolio');;
这对我来说没有意义,因为它应该找到__invoke
,这是PortfolioController.php
中唯一的一个
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PortfolioController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
$portfolio = [
['title' => 'Project #1'],
['title' => 'Project #2'],
['title' => 'Project #3'],
['title' => 'Project #4'],
];
return view('portfolio',compact('portfolio'));
}
}
Laravel 8是否忽略了__invoke
属性?
发布于 2020-10-03 20:45:50
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');
^^^^^^^^^^^^^^^^^^^^^
PortfolioController
字符串使用App\Http\Controllers
命名空间。
然而,自Laravel 8以来,这种行为已被改变。来自v8发行说明
在Laravel8.x中,默认情况下此属性为
null
。这意味着Laravel不会自动进行名称空间前缀。因此,在新的Laravel 8.x应用程序中,应该使用标准PHP可调用语法定义控制器路由定义: 使用App\Http\Controller\UserController;路由::get(‘/ use’,UserController::class,'index');
现在,对于您提到的特殊情况,__invoke()
方法,这是您应该如何处理它们的根据医生的说法
在为单个动作控制器注册路由时,不需要指定方法: 使用App\Http\Controller\ShowProfile;路由::get(‘user/{id}’,ShowProfile::class);
发布于 2020-10-04 23:14:30
另一个用途,您可以使用完整的路径。
Route::get('/portfolio', 'App\Http\Controllers\PortfolioController')->name('portfolio');
或者调用特定的方法
Route::get('/portfolio', 'App\Http\Controllers\PortfolioController@foo')->name('portfolio')
https://stackoverflow.com/questions/64187141
复制相似问题