gpt4 book ai didi

php - 目标类 Controller 不存在 - Laravel 8

转载 作者:行者123 更新时间:2023-12-02 10:08:57 25 4
gpt4 key购买 nike

这是我的 Controller :

<?php

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');
}
}
如屏幕截图所示,该类存在并且位于正确的位置:
enter image description here
我的 api.php路线:
Route::get('register', 'Api\RegisterController@register');
当我打我的 register使用 postman 路由,它给了我以下错误:

Target class [Api\RegisterController] does not exist.



更新:
多亏了答案,我才能修复它。我决定为此路由使用完全限定的类名,但还有其他选项,如答案中所述。
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');

最佳答案

您正在使用 Laravel 8。在 Laravel 8 的全新安装中,没有将命名空间前缀应用于您的路由加载到的路由组。

"In previous releases of Laravel, the RouteServiceProvider contained a $namespace property. This property's value would automatically be prefixed onto controller route definitions and calls to the action helper / URL::action method. In Laravel 8.x, this property is null by default. This means that no automatic namespace prefixing will be done by Laravel." Laravel 8.x Docs - Release Notes


当不使用命名空间前缀时,在路由中引用它们时,您必须为 Controller 使用完全限定的类名。
use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');
如果您更喜欢旧方式: App\Providers\RouteServiceProvider :
public function boot()
{
...

Route::prefix('api')
->middleware('api')
->namespace('App\Http\Controllers') // <---------
->group(base_path('routes/api.php'));

...
}
对您想要为其声明命名空间的任何路由组执行此操作。
$namespace属性(property):
虽然提到了 $namespace要在您的 RouteServiceProvider 上设置的属性在发行说明中并在您的 RouteServiceProvider 中评论这对您的路线没有任何影响。它目前仅用于添加命名空间前缀以生成 Action 的 URL。所以你可以设置这个变量,但它本身不会添加这些命名空间前缀,你仍然必须确保在将命名空间添加到路由组时使用这个变量。
此信息现在位于升级指南
Laravel 8.x Docs - Upgrade Guide - Routing
升级指南显示的内容 重要 部分是您正在路由组上定义命名空间。设置 $namespace变量本身 只有有助于生成 Action 的 URL。
再说一次,我再怎么强调也不为过, 重要 部分是为路由组设置命名空间,它们恰好通过引用成员变量 $namespace 来完成。直接在例子中。
更新:
如果您从 laravel/laravel 的 8.0.2 版开始安装了 Laravel 8 的全新副本您可以取消注释 protected $namespace RouteServiceProvider中的成员变量回到旧的方式,因为路由组被设置为使用这个成员变量作为组的命名空间。
// protected $namespace = 'App\\Http\\Controllers';
只有取消注释将命名空间前缀添加到分配给路由的 Controller 的原因是因为路由组设置为使用此变量作为命名空间:
...
->namespace($this->namespace)
...

关于php - 目标类 Controller 不存在 - Laravel 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63807930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com