当我将目标类 [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 使用在 RouteServiceProviderApp\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 项目

XCTest 不会从我的目标应用程序链接类

当我将@Bean 添加到主类时出现 IllegalStateException

我正在尝试制作像应用程序一样的照片库,但是当我将位图对象添加到arraylist时,我将钳制目标GC堆从128MB到128MB

悬停链接并在 SVG 中更改颜色 [重复]

当我将模板类与非模板类放在同一个 cpp 文件中时出现链接错误 - C++