目标类控制器不存在-Laravel 8 在laravel 8中,您只需在route \ web.php中添加控制器名称空间转到“ app \ Providers \ RouteServiceProvider.php”路径并删除注释

问题描述

这是我的控制人:

<?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路线时,它给了我以下错误:

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


更新

多亏了答案,我才得以解决。我决定为此路线使用完全限定的类名称,但答案中还介绍了其他选项。

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

解决方法

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

“在Laravel的早期版本中,RouteServiceProvider包含一个$namespace属性。该属性的值将自动添加到控制器路由定义的前缀,并调用action助手/ {{1 }}方法。在Laravel 8.x中,此属性默认为URL::action。这意味着Laravel不会自动命名空间前缀。” Laravel 8.x Docs - Release Notes

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

null

如果您喜欢旧方法:

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属性,并在RouteServiceProvider中添加注释,但这对您的路线没有任何影响。当前仅用于添加名称空间前缀以生成操作的URL。因此,您可以设置此变量,但它本身不会添加这些名称空间前缀,仍然需要确保在将名称空间添加到路由组时使用此变量。

此信息现在在升级指南中

Laravel 8.x Docs - Upgrade Guide - Routing

升级指南显示的重要部分是,您在路由组上定义了名称空间。单独设置RouteServiceProvider变量(仅)有助于生成操作的URL。

再次强调一下,重要部分是为路由组设置名称空间,它们只是通过引用成员变量$namespace来完成的直接在示例中。

更新:

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

RouteServiceProvider

之所以取消注释,是将名称空间前缀添加到分配给路由的控制器上,这是唯一的原因,因为路由组已设置为将此变量用作名称空间:

// protected $namespace = 'App\\Http\\Controllers';
,
  • 是的,在 laravel 8 中会发生此错误。
  • 尝试了许多解决方案后,我得到了这些完美的解决方案
  • 只需执行以下步骤...

案例-1

我们可以在 api.php web.php 这样的文件中进行更改,例如以下。.
我们目前写syntex的方式是

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'; enter image description here
  3. 然后在添加行 ->namespace($this->namespace) 后,如图所示。.
    enter image description here
,

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

laravel 8更新了RouteServiceProvider,它会影响字符串语法的路由,您可以像上面一样对其进行更改,但是建议的方法是使用操作语法而不是将路由语法与字符串语法一起使用:

nodetool flush

应更改为:

cqlsh> TRUNCATE ks_name.table_name
,

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

路由命名空间更新

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

use App\Http\Controllers\UserController;

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

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

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

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

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


没有解释为什么 Taylor Otwell 添加这个令人抓狂的陷阱,但我认为他有他的理由。

,

在laravel 8中,您只需在route \ 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';

,

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

The Error that I got:

但是当我看到我的 app/Providers/RouteServiceProvider.php 时,我的引导方法中有命名空间,然后我只是取消了注释 => protected $namespace = 'App\\Http\\Controllers';

Just Uncomment The protected $namespace = 'App\Http\Controllers';';

现在我的项目正在运行:

Project is working safe and sound

希望对你有所帮助。

,

如果您想继续使用原始的自动前缀控制器路由,只需在RouteServiceProvider中设置$ namespace属性的值,并在引导方法中更新路由注册以使用$ 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'));
    });
}
,

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

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

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

,

在本期中, 我只是添加如下命名空间 它有效

enter image description here

,

在新安装的 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';

取消注释

受保护的 $namespace = 'App\Http\Controllers';

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

如果您是从较低版本的 laravel 升级到 8,那么您可能必须隐式添加

受保护的 $namespace = 'App\Http\Controllers';

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

,

在 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 并在路由方法中激活。

按照以下图片说明进行操作:

enter image description here

,

如果您使用的是laravel 8

只需复制并粘贴我的代码

use App\Http\Controllers\UserController;

Route::get('/user','index']);
,

在laravel-8中,您可以像这样使用

 Route::group(['namespace'=>'App\Http\Controllers','prefix'=>'admin','as'=>'admin.','middleware'=>['auth:sanctum','verified']],function()
{
    Route::resource('/dashboard','DashboardController')->only([
        'index'
    ]);
});

谢谢

,

如果您希望将此路线分组,可以按照以下步骤操作:

Route::group(['namespace' => 'App\Http\Controllers\Api'],function () {
    Route::resource('user','UserController');
    Route::resource('book','BookController');
});

,

我遇到了这个错误

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

解决方案: 只需检查您的类名,它应该与您的文件名完全相同。

,

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

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

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

just uncomment line 29

,

在Laravel 8中,指定路线的方式已更改:

Route::resource('homes',HomeController::class)->names('home.index');
,

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

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

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

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

如果没有中间件,则传递 [] 有效,或者如果不使用中间件,则可能只是删除 middleware 调用 :D

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...