目标 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;
我在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;