251

这是我的控制器:

<?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');
    }
}

如屏幕截图所示,该类存在并且位于正确的位置:

在此处输入图像描述

我的api.php路线:

Route::get('register', 'Api\RegisterController@register');

当我register使用 Postman 到达我的路线时,它给了我以下错误:

目标类 [Api\RegisterController] 不存在。


更新:

感谢答案,我能够修复它。我决定为这条路线使用完全限定的类名,但还有其他选项,如答案中所述。

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
4

20 回答 20

485

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

“在以前的 Laravel 版本中,RouteServiceProvider包含一个$namespace属性。这个属性的值将自动添加到控制器路由定义和对action助手/URL::action方法的调用中。在 Laravel 8.x 中,默认情况下,这个属性null。这意味着没有自动命名空间前缀将由 Laravel 完成。” Laravel 8.x 文档 - 发行说明

在不使用命名空间前缀的情况下,在路由中引用控制器时,您必须为控制器使用完全限定的类名。

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

尽管在发行说明中提到要在您的$namespace属性上设置并在您的注释中评论这对您的路线没有任何影响。它目前仅用于添加命名空间前缀以生成操作的 URL。所以你可以设置这个变量,但它本身不会添加这些命名空间前缀,你仍然必须确保在将命名空间添加到路由组时使用这个变量。RouteServiceProviderRouteServiceProvider

此信息现在位于升级指南中

Laravel 8.x 文档 - 升级指南 - 路由

升级指南显示的重要部分是您在路由组上定义命名空间。单独设置$namespace变量有助于生成操作的 URL。

再一次,我不能强调这一点,重要的部分是为路由组设置命名空间,他们恰好通过$namespace在示例中直接引用成员变量来做到这一点。

更新:

如果您从 8.0.2 版开始安装了 Laravel 8 的新副本,则laravel/laravel可以取消注释中的protected $namespace成员变量RouteServiceProvider以返回旧方式,因为路由组已设置为将此成员变量用于组的命名空间。

// protected $namespace = 'App\\Http\\Controllers';

取消注释会将命名空间前缀添加到分配给路由的控制器的唯一原因是因为路由组设置为使用此变量作为命名空间:

...
->namespace($this->namespace)
...
于 2020-09-09T08:53:46.413 回答
68
  • 是的,在Laravel 8中确实会发生此错误。
  • 在尝试了许多解决方案后,我得到了这个完美的解决方案。
  • 只需按照步骤...

情况1

我们可以更改文件api.phpweb.php如下所示。我们目前的写作方式syntax

Route::get('login', 'LoginController@login');

那应该改为:

Route::get('login', [LoginController::class, 'login']);

案例2

  1. 首先进入文件:app > Providers > RouteServiceProvider.php

  2. 在该文件中,将行替换 protected $namespace = null;protected $namespace = 'App\Http\Controllers';
    在此处输入图像描述

  3. 然后添加行->namespace($this->namespace),如图所示...

    在此处输入图像描述

于 2020-09-18T16:23:34.097 回答
19

在 Laravel 8 中默认是删除命名空间前缀,所以你可以在 Laravel 7 中设置旧的方式,如:

RouteServiceProvider.php中,添加此变量:

protected $namespace = 'App\Http\Controllers';

并更新boot方法:

public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));

        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));
    });
}
于 2020-09-12T15:24:42.953 回答
16

在 Laravel 8 中,您只需将控制器命名空间添加到 routes\web.php

use App\Http\Controllers\InvoiceController; // InvoiceController is controller name

Route::get('invoice',[InvoiceController::class, 'index']);

或转到: app\Providers\RouteServiceProvider.php路径并删除评论:

protected $namespace = 'App\\Http\\Controllers';
于 2020-11-07T04:43:12.987 回答
10

Laravel 8 更新了 RouteServiceProvider,它使用字符串语法影响路由。您可以像以前的答案一样更改它,但推荐的方法是使用操作语法,而不是使用带有字符串语法的路由:

Route::get('register', 'Api\RegisterController@register');

应改为:

Route::get('register', [RegisterController::class, 'register']);
于 2020-09-22T03:45:43.603 回答
8

如果您使用的是 Laravel 8,只需复制并粘贴我的代码:

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);
于 2020-10-14T10:27:39.633 回答
8

在 Laravel 8 中定义路由的方法是

// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::get('/', [HomeController::class, 'index']);

或者

// Using string syntax...
Route::get('/', 'App\Http\Controllers\HomeController@index');

资源路径变为

// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::resource('/', HomeController::class);

这意味着在 laravel 8 中,默认情况下没有自动控制器声明前缀。

如果你想坚持旧的方式,那么你需要 app\Providers\RouteServiceProvider.php在 routes 方法中添加一个命名空间属性并激活。

于 2021-01-05T18:02:29.320 回答
7

Laravel 8 文档实际上比这里的任何答案都更简洁明了地回答了这个问题:

路由命名空间更新

在之前的 Laravel 版本中,RouteServiceProvider包含一个$namespace属性。该属性的值将自动添加到控制器路由定义和对action助手/URL::action方法的调用上。在 Laravel 8.x 中,这个属性是null默认的。这意味着 Laravel 不会自动为命名空间添加前缀。因此,在新的 Laravel 8.x 应用程序中,控制器路由定义应该使用标准的 PHP 可调用语法来定义:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

action相关方法的调用应使用相同的可调用语法:

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

如果你更喜欢 Laravel 7.x 风格的控制器路由前缀,你可以简单地将$namespace属性添加到应用程序的RouteServiceProvider.

于 2021-02-03T20:00:54.177 回答
6

我在安装 Laravel 8.27.0 版本时遇到了同样的错误:错误如下:

我得到的错误。

但是当我看到我的app/Providers/RouteServiceProvider.php文件时,我的引导方法中有命名空间。然后我只是取消注释这个 =>protected $namespace = 'App\\Http\\Controllers'; 现在我的项目正在运行

于 2021-02-25T05:18:59.593 回答
3

如果您想继续使用原始的自动前缀控制器路由,您可以简单地在 RouteServiceProvider 中设置 $namespace 属性的值,并在 boot 方法中更新路由注册以使用 $namespace 属性:

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
    });
}
于 2020-09-12T03:50:06.070 回答
3

对于解决方案,只需取消注释第 29 行:

**protected $namespace = 'App\\Http\\Controllers';**

在“ app\Providers\RouteServiceProvider.php ”文件中。

只需取消注释第 29 行

于 2020-10-21T01:54:29.403 回答
2

只需取消注释以下行RouteServiceProvider(如果不存在,则添加它):

protected $namespace = 'App\\Http\\Controllers';
于 2020-10-08T07:23:46.177 回答
1

在 Laravel 8 中,你可以像这样使用它:

Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin',
 'as'=>'admin.', 'middleware' => ['auth:sanctum', 'verified']], function()
{
    Route::resource('/dashboard', 'DashboardController')->only([
        'index'
    ]);
});
于 2020-09-23T09:19:52.563 回答
1

如果您的 RegisterController 正确就位,还请检查您的路由web.php文件。

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisterController;


Route::get('/register',[RegisterController::class,'index'])->name('register');
Route::post('/register',[RegisterController::class,'store']);

Route::get('/', function () {
    return view('test.index');
});
于 2022-02-18T01:27:44.230 回答
0

如果您更喜欢对这些路线进行分组,您可以这样做:

Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
    Route::resource('user', 'UserController');
    Route::resource('book', 'BookController');
});
于 2020-10-28T15:15:45.583 回答
0

在新安装的 Laravel 8 上,在App/Providers/RouteServices.php文件中:

 /*
 * The path to the "home" route for your application.
 *
 * This is used by Laravel authentication to redirect users after login.
 *
 * @var string
 */
public const HOME = '/home';

/**
 * The controller namespace for the application.
 *
 * When present, controller route declarations will automatically be prefixed with this namespace.
 *
 * @var string|null
 */
 // protected $namespace = 'App\\Http\\Controllers';

取消注释行

protected $namespace = 'App\\Http\\Controllers';

这应该可以帮助您以老式的方式运行 Laravel。

如果您从 Laravel 的低版本升级到 8,那么您可能需要隐式添加行

protected $namespace = 'App\\Http\\Controllers';

RouteServices.php文件中以使其以旧方式运行。

于 2021-01-15T12:32:57.330 回答
-1

在 Laravel 8 中,指定路线的方式发生了变化:

Route::resource('homes', HomeController::class)->names('home.index');
于 2020-10-17T18:25:24.293 回答
-1

我有这个错误:

(Illuminate\Contracts\Container\BindingResolutionException 目标类 [App\Http\Controllers\ControllerFileName] 不存在。

解决方案:

只需检查您的班级名称。它应该与您的文件名完全相同。

于 2020-10-25T10:18:30.583 回答
-1

当我将 null 传递给middleware函数时,它发生在我身上:

Route::middleware(null)->group(function () {
    Route::get('/some-path', [SomeController::class, 'search']);
});

通过[]没有中间件的作品。或者如果不使用中间件,可能只是删除middleware调用:D

于 2021-02-27T21:11:29.447 回答
-1

app/Providers 文件夹的 RouteServiceProvider.php 文件中,将受保护的$namespace变量更改为

protected $namespace = 'App\\Http\\Controllers';

这将在保存时自动注释变量。

于 2021-04-17T09:56:10.170 回答