当我将目标类 [Agent\App\Http\Controllers\PropertyController] 放在路由组中时,它不存在
Posted
技术标签:
【中文标题】当我将目标类 [Agent\\App\\Http\\Controllers\\PropertyController] 放在路由组中时,它不存在【英文标题】:Target class [Agent\App\Http\Controllers\PropertyController] does not exist when I put it inside the route group当我将目标类 [Agent\App\Http\Controllers\PropertyController] 放在路由组中时,它不存在 【发布时间】:2021-11-27 13:56:39 【问题描述】:我在 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 工匠路线:列表
我收到了这个错误:
Illuminate\Contracts\Container\BindingResolutionException
目标类 [Agent\App\Http\Controllers\PropertyController] 不 存在。
在 C:\xampp\htdocs\sweethomeFinal\vendor\laravel\framework\src\Illuminate\Container\Container.php:879
875▕
876▕ 试试
877▕ $reflector = new ReflectionClass($concrete);
878▕ 捕捉 (ReflectionException $e)
879▕ throw new BindingResolutionException("目标类 [$concrete] 确实 不存在。", 0, $e);
880▕
881▕
882▕ // 如果类型不可实例化,开发者正在尝试解析
883▕ // 一个抽象类型,例如接口或抽象类和 有
1 [内部]:0 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Consoleclosure(Object(Illuminate\Routing\Route))
2 C:\xampp\htdocs\sweethomeFinal\vendor\laravel\framework\src\Illuminate\Container\Container.php:877 ReflectionException::("类代理\App\Http\Controllers\PropertyController 不存在")
但是当我将"Route::resource('/properties', PropertyController::class);"
放在身份验证之外时
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 里面,请问有什么问题吗?
【问题讨论】:
这能回答你的问题吗? Target class controller does not exist - Laravel 8 我阅读了该问题的所有答案并尝试了它,但还是一样,我还执行了一些命令,例如 route:cache、dump-autoload 和 optimize。 【参考方案1】:在 Laravel 8 之前,组命名空间是有意义的,但现在使用将路由定义为 Controller::class
的建议方式,前缀基本上没用了。
Laravel 8 之前的路由
在 v8 之前,Laravel 使用在 RouteServiceProvider
的 App\Http\Controllers\
中定义的默认前缀。这意味着您只需要提供最后一部分 - MyController
,它会自动构建为完全限定的类名 (App\Http\Controllers\MyController
)。
从 v8 开始的路由
在 v8 中,删除了默认控制器路径 ($namespace = null
),这意味着您必须自己提供完全限定的类名,或者将前缀添加回服务提供者。最有效的方法是使用返回所需名称的::class
语法。这种提供类名的方法也对 IDE 更友好,这是切换的主要原因之一。
路由组命名空间的问题
在构建控制器类名称的旧方法中,组命名空间对于控制器文件夹中的子文件夹很有用。
路径会像这样构建:
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 不包含在 version 8 docs 中,因为即使它仍然“有效”,它也不是很有用。
【讨论】:
感谢您的精彩解释,先生。我一直在寻找我能做的事情,因为我走错了路,我不知道如何弄清楚我希望在哪里创建只能让代理访问的属性。因此,当我输入添加按钮时,它会路由到“代理/属性/创建”。如果您不介意先生,您能给我举个例子吗?【参考方案2】:您正在使用 laravel 8。在您的 web.php 中添加以下行。
使用 App\Http\Controllers\你的控制器名称;
【讨论】:
感谢您的回复。我已经这样做了,但还是一样。【参考方案3】:当您为路由组设置命名空间时,该组中的所有路由都会将该命名空间作为其名称的前缀。
从组定义中删除,'namespace'=>'Agent'
,它应该解决它。
更多详情请参阅laravel doc。
【讨论】:
感谢您的回复。我试过了,但我收到一个错误,上面写着“agent.dashboard 未定义”。我是否需要添加或更改某些内容才能使其正常工作? remve 'prefix'=>'agent' .....用'name'替换'as' 非常感谢,先生,现在可以使用了。当我替换为 name 时,这意味着它是路由组的名称? 表示该组中所有路由的名称前缀以上是关于当我将目标类 [Agent\App\Http\Controllers\PropertyController] 放在路由组中时,它不存在的主要内容,如果未能解决你的问题,请参考以下文章
将 Swift 类添加到具有多个目标的 Objective-C 项目
当我将@Bean 添加到主类时出现 IllegalStateException
我正在尝试制作像应用程序一样的照片库,但是当我将位图对象添加到arraylist时,我将钳制目标GC堆从128MB到128MB