当前位置: 首页 > 知识库问答 >
问题:

目标类控制器不存在-Laravel 8

林德华
2023-03-14

这是我的控制器:

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

当我使用Postman点击我的寄存器路由时,它给了我以下错误:

目标类[Api\寄存器控制器]不存在。

更新:

多亏了这个答案,我才把它修好了。我决定对这个路由使用完全限定的类名,但是还有其他选项,如答案中所述。

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

共有3个答案

乐正浩宕
2023-03-14

在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'));
    });
}
弓宏茂
2023-03-14
  • 是的,在Laravel 8中确实会发生此错误

我们可以在api中进行更改。phpweb。php文件,如下所示。当前我们编写语法的方式是

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

应改为:

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

>

  • 首先转到文件:app

    然后添加行-

  • 赵晟睿
    2023-03-14

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

    “在Laravel的早期版本中,RouteServiceProvider包含一个$namespace属性。此属性的值将自动作为前缀添加到控制器路由定义中,并调用actionhelper/URL::action方法。在Laravel 8.x中,此属性默认为null。T他的意思是,Laravel不会自动进行名称空间前缀。”拉威尔8。x文档-发行说明

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

    use App\Http\Controllers\UserController;
    
    Route::get('/users', [UserController::class, 'index']);
    // or
    Route::get('/users', 'App\Http\Controllers\UserController@index');
    

    应用\提供商\RouteServiceProvider

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

    对任何要为其声明命名空间的路由组执行此操作。

    $命名空间属性:

    尽管在发行说明中提到了要在RouteServiceProvider上设置的$namespace属性,并在RouteServiceProvider中进行了注释,但这对路由没有任何影响。它当前仅用于添加名称空间前缀,以便为操作生成URL。因此,您可以设置此变量,但它本身不会添加这些名称空间前缀,您仍然必须确保在将名称空间添加到路由组时使用此变量。

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

    Laravel 8. x Docs-升级指南-路由

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

    同样,我再怎么强调也不为过,重要的部分是设置路由组的命名空间,它们只是碰巧通过直接在示例中引用成员变量$命名空间来完成。

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

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

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

    ...
    ->namespace($this->namespace)
    ...
    
     类似资料:
    • 我今天去拉拉维尔8号兜风,但是似乎路线立面再也找不到控制器了。 路线给了我以下错误: 目标类[HomeController]不存在。 我在运行时遇到了类似的错误:

    • 我最近开始研究Laravel,并安装了Laravel Framework 8.5。0 下面是我的控制器"UserController.php" 这是我的网站。路由中的php 当我尝试访问http://127.0.0.1:8000/users,它只是用下面的错误击中我 Illumb\Contracts\Container\BindingResolutionException 目标类[UserCont

    • 我想在缓存控制头中设置max age以响应。我已经写了如下,但仍然有max-age 0。我想只为一种方法设置max age,所以我不想禁用默认值。我认为应该是ovveride。 有人知道我做错了什么吗?

    • 我的Laravel应用程序在。请理解,这是我第一次申请Laravel。 Illumb\Contracts\Container\BindingResolutionException目标类 [UserController]不存在。 当我尝试以下代码在web.php. 用户控制器文件: 然而,这行得通。 迁移已经运行,表已在数据库中成功创建。 环境: 完整的错误报告在Flare上共享

    • 我得到这个错误后,通常的安装,为我工作了多年。。。我真的不知道现在发生了什么变化。。有人能帮忙吗?

    • 使用php artisan route:list后,我在Laravel 8中遇到此错误: Illumb\Contracts\Container\BindingResolutionException目标类[Api\UserController]不存在。 我在App\Http\Controllers\Api中有一个控制器: 路线/api.php: 我是新来的