目标 class [Agent\App\Http\Controllers\PropertyController] 放在路由组中时不存在

Target class [Agent\App\Http\Controllers\PropertyController] does not exist when I put it inside the route group

我在web.php

中有这条路线
 Route::group(['prefix'=>'agent','namespace'=>'Agent','middleware'=> 
     ['auth','agent'],'as'=>'agent.'], function()
{
    Route::get('/dashboard',[AgentController::class, 'index'])->name('dashboard');
    Route::resource('/properties', PropertyController::class);

});
 

当我运行下面的命令时,

php artisan route:list

我收到这个错误:

Illuminate\Contracts\Container\BindingResolutionException

Target class [Agent\App\Http\Controllers\PropertyController] does not exist.

at C:\xampp\htdocs\sweethomeFinal\vendor\laravel\framework\src\Illuminate\Container\Container.php:879

875▕

876▕ try {

877▕ $reflector = new ReflectionClass($concrete);

878▕ } catch (ReflectionException $e) {

879▕ throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);

880▕ }

881▕

882▕ // If the type is not instantiable, the developer is attempting to resolve

883▕ // an abstract type such as an Interface or Abstract Class and there is

1 [internal]:0 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console{closure}(Object(Illuminate\Routing\Route))

2
C:\xampp\htdocs\sweethomeFinal\vendor\laravel\framework\src\Illuminate\Container\Container.php:877 ReflectionException::("Class Agent\App\Http\Controllers\PropertyController does not exist")

但是当我将 "Route::resource('/properties', PropertyController::class);" 放在 auth

之外时
Route::group(['prefix'=>'agent','namespace'=>'Agent','middleware'=> 
     ['auth','agent'],'as'=>'agent.'], function()
{
    Route::get('/dashboard',[AgentController::class, 'index'])->name('dashboard');  
});
Route::resource('/properties', PropertyController::class);

它只是显示了所有的路由列表。但是我想把它放在auth里面,请问有什么问题吗?

当您为路由组设置命名空间时,该组中的所有路由都将该命名空间作为其名称的前缀。

去掉,'namespace'=>'Agent'形成组定义,应该可以解决

有关详细信息,请参阅 laravel doc

组名称空间在 Laravel 8 之前是有意义的,但现在使用将路由定义为 Controller::class 的建议方式,前缀基本上没用了。

路由在Laravel 8

之前

在 v8 之前,Laravel 使用了在 App\Http\Controllers\RouteServiceProvider 中定义的默认前缀。这意味着您只需提供最后一部分 - MyController,它会自动构建为完全限定的 class 名称 (App\Http\Controllers\MyController).

从 v8 开始的路由

在 v8 中,删除了默认控制器路径 ($namespace = null),这意味着您必须自己提供完全限定的 class 名称,或者将前缀添加回服务提供商。最有效的方法是使用 ::class 语法,其中 returns 所需的名称。这种提供 class 名称的方法也更加 IDE 友好,这是转换的主要原因之一。

路由组命名空间的问题

在构建控制器 class 名称的旧方法中,组命名空间对于控制器文件夹中的子文件夹很有用。

路径将构建为:

{default_prefix} + {group_namespace} + {controller name}

产量:

App\Http\Controllers\ + Agent\ + PropertyController.

这实际上仍然是版本 8 中的工作方式;但是,您以不同的方式提供值:

(null) + Agent + App\Http\Controllers\PropertyController,路径不对。

总结

当对 Laravel 路由使用 ::class 语法时,组级命名空间前缀真的没有意义了。

如果您浏览 Laravel 文档的版本,您还会注意到 usage of group namespaces present in version 7 is not included in the version 8 docs,因为即使它仍然“有效”,也不是很有用。

您正在使用 laravel 8。在您的 web.php .

中添加以下行

使用App\Http\Controllers\yourcontrollername;