在laravel 8中出现了“目标类[ProductController]不存在”的错误。路由的写法是不同的。
在laravel 8中出现了“目标类[ProductController]不存在”的错误。路由的写法是不同的。
以下是我的控制器代码:
namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class RegisterController extends Controller { public function register(Request $request) { dd('aa'); } }
如截图所示,该类存在并且位于正确的位置:
![截图](https://i.stack.imgur.com/H4CtY.png)
我的`api.php`路由代码如下:
Route::get('register', 'Api\RegisterController@register');
当我使用Postman访问我的`register`路由时,出现了以下错误:
目标类[Api\RegisterController]不存在。
我该如何修复它?
感谢答案,我已经成功修复了这个问题。我决定在该路由中使用完全限定的类名,但还有其他答案中提到的选项。
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
在Laravel 8中,定义路由的方式有所改变。现在可以使用PHP可调用语法或字符串语法来定义路由。如果使用PHP可调用语法,需要引入控制器类并指定控制器方法。如果使用字符串语法,需要指定完整的控制器命名空间和控制器类名。
在Laravel 8中,资源路由的定义也有所变化。使用PHP可调用语法时,需要引入控制器类并指定控制器类名。这意味着在Laravel 8中,默认情况下不再自动添加控制器命名空间前缀。
如果想继续使用旧的方式,需要在app\Providers\RouteServiceProvider.php
文件中添加一个命名空间属性,并在路由方法中激活它。
因此,如果在Laravel 8中出现"Target class [ProductController] does not exist"错误,原因是路由的书写方式不正确。解决方法是根据Laravel 8的新路由定义方式进行修改,引入控制器类并指定正确的命名空间和类名。
例如,如果有一个ProductController控制器类位于App\Http\Controllers命名空间下,可以按照以下方式定义路由:
// 使用PHP可调用语法 use App\Http\Controllers\ProductController; Route::get('/', [ProductController::class, 'index']);
或
// 使用字符串语法 Route::get('/', 'App\Http\Controllers\ProductController@index');
如果想使用资源路由,可以按照以下方式定义:
// 使用PHP可调用语法 use App\Http\Controllers\ProductController; Route::resource('/', ProductController::class);
如果希望继续使用旧的方式,在app\Providers\RouteServiceProvider.php
文件中添加以下代码:
protected $namespace = 'App\Http\Controllers';
然后在路由方法中激活该命名空间:
protected function mapApiRoutes() { Route::middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
通过按照以上方法修改路由定义,即可解决"Target class [ProductController] does not exist"错误。
在Laravel 8中出现了“Target class [ProductController] does not exist”错误。
问题的原因是路由的写法不同。
解决方法如下:
第一种情况是修改api.php和web.php文件中的写法。在当前的写法中,我们使用的是:
Route::get('login', 'LoginController');
应该将其改为:
Route::get('login', [LoginController::class, 'login']);
第二种情况是在app > Providers > RouteServiceProvider.php文件中进行修改。将
protected $namespace = null;
替换为
protected $namespace = 'App\Http\Controllers';
并且在下面添加一行代码
->namespace($this->namespace)
对于第一种情况,如果我们有一个资源控制器,即没有指定具体的函数,那该怎么办?
Route::resource("proxies", ProxyController::class)
会出现类找不到的错误,它在命名空间中使用了两次App\Http\Controllers\ProxyController。
谢谢,这个方法很神奇,现在我得到了404错误。
在Laravel 8中出现了"Target class [ProductController] does not exist"错误。这是因为在Laravel 8的新安装中,您的路由组没有应用命名空间前缀。
在之前的Laravel版本中,RouteServiceProvider包含一个$namespace属性。该属性的值会自动添加到控制器路由定义和action助手/URL::action方法的调用中。在Laravel 8.x中,默认情况下,该属性为null。这意味着Laravel不会自动添加命名空间前缀。
因此,当不使用命名空间前缀时,在路由中引用控制器时,您必须使用完全限定的类名。
如果您喜欢旧的方式:
在App\Providers\RouteServiceProvider中添加命名空间:
public function boot() { ... Route::prefix('api') ->middleware('api') ->namespace('App\Http\Controllers') // 添加命名空间 ->group(base_path('routes/api.php')); ... }
对于需要声明命名空间的所有路由组都要进行相同的操作。
$namespace属性:
尽管在升级说明和RouteServiceProvider中都提到了$namespace属性,但它对于路由没有任何影响。它目前仅用于为生成操作的URL添加命名空间前缀。因此,您可以设置这个变量,但它本身并不会添加这些命名空间前缀,您仍然需要确保在添加命名空间到路由组时使用这个变量。
这些信息现在已经在升级指南中提到了。
如果您从Laravel 8.0.2版本开始安装的新版本,可以取消注释RouteServiceProvider中的protected $namespace成员变量,以恢复旧的方式,因为路由组已设置为使用此成员变量作为组的命名空间。
唯一的原因是取消注释这个变量会将命名空间前缀添加到分配给路由的控制器,是因为路由组已设置为使用这个变量作为命名空间。
最新版本中,我们可以简单地取消注释app/Providers/RouteServiceProvider.php中的// protected $namespace = 'App\\Http\\Controllers';
,因为在boot方法中的路由声明中使用了->namespace($this->namespace)
,对吗?
从Laravel 8.0.2版本开始,您可以取消注释并使用它。
您好,现在已经很晚了,但我仍然在努力解决"Target class [] does not exist"错误。我正在开发一个Laravel包,我做得很好,但当我使用正确的命名空间注册我的路由时,它给我返回错误"Target class [CORRECT_NAMESPACE/CONTROLLER] does not exist",有人能告诉我可能的原因吗?谢谢。
世界因为stackoverflow和像你这样的人而变得美妙...
为什么使用Route::get('/users', [UserController::class, 'index'])->name('users');
仍然会返回此错误?最终我使用了您更新的选项,它起作用了,但我很想知道发生了什么。
更新2021年。在Laravel 8中,请使用上面回答中显示的新方法。使用Route::get('route', [App\Http\Controllers\SocialController::class, 'redirect']);
这样的格式。不要使用Route::get('route','SocialController');
。在以前的版本中,我们只需使用"ControllerName",但现在我们必须使用[App\Http\Controllers]。希望将来能简化这个过程。Taylor Otwell正在努力工作,并且已经创建了一个革命性的框架。热爱Laravel。