Laravel 目标类 [App\Http\Controllers\App\Http\Controllers\ApiController] 不存在

Posted

技术标签:

【中文标题】Laravel 目标类 [App\\Http\\Controllers\\App\\Http\\Controllers\\ApiController] 不存在【英文标题】:Laravel Target class [App\Http\Controllers\App\Http\Controllers\ApiController] does not existLaravel 目标类 [App\Http\Controllers\App\Http\Controllers\ApiController] 不存在 【发布时间】:2020-05-01 06:48:02 【问题描述】:

出于某种原因,这可能是我的错,Laravel 认为它应该在路径中寻找类 ApiController:'App\Http\Controllers\App\Http\Controllers',所以......它加倍,但我有不知道为什么。

这是一个全新的 Laravel 6 项目,我使用 make:controller artisan 命令创建了 ApiController 并添加了一个函数,如下所示:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ApiController extends Controller

    public function base() 
        return 'This is a test function';
    

然后我在 api 路由中添加了一个路由,如下所示:

use App\Http\Controllers\ApiController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::group(['prefix' => '/v1', 'as' => 'api'], function () 
    Route::get('/base', ['uses' => ApiController::class . '@base'])->name('base');
);

如您所见,我什至“导入”了控制器,但就是找不到。 就是这样,没有其他文件或项目更改。还尝试清除路由缓存和转储自动加载,但这并没有改变任何东西。

【问题讨论】:

大小写很重要 - 是否有一个名为 app/Http/Controllers/ApiController.php 的文件?或者是APIController.php 为什么不直接使用 Route::get('/base', 'ApiController@base')->name('base'); 我相信,'uses' => .... 添加默认命名空间。你可以这样做[ApiController::class , 'base'] 【参考方案1】:

要么删除这一行:

use App\Http\Controllers\ApiController;

或在开头添加\

use \App\Http\Controllers\ApiController;

【讨论】:

【参考方案2】:

这应该可行:

Route::group(['prefix' => '/v1', 'as' => 'api'], function () 
    Route::get('base', 'ApiController@base')->name('base');
);

不需要添加“使用”,因为控制器是从 App/Controllers 命名空间引用的,因为您可以在 RouteServiceProvider 上证实。

【讨论】:

【参考方案3】:

路由的语法是“旧语法”与“新语法”的组合

你想要达到的是:

Route::get('/base', [ApiController::class, 'base'])->name('base');

【讨论】:

【参考方案4】:

如果你想在路由器中引用 ::class ,应该这样做。

Route::group(['prefix' => '/v1', 'as' => 'api'], function () 
    Route::get('base', [ApiController::class, 'base'])->name('base');
);

【讨论】:

【参考方案5】:

在我的情况下,问题是,在 RouteServiceProvider 中,使用路由 Namespace

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

在 Laravel 8 命名空间是 commented out,我从链中删除命名空间,因为我的网络路由没有完全移动到 Laravel 8 语法,我需要这个命名空间。

 Route::prefix('api')
      ->middleware('api')   
      -̶>̶n̶a̶m̶e̶s̶p̶a̶c̶e̶(̶$̶t̶h̶i̶s̶-̶>̶n̶a̶m̶e̶s̶p̶a̶c̶e̶)̶
      ->group(base_path('routes/admin-api.php'));

【讨论】:

【参考方案6】:

在我的情况下(Laravel 8 项目),我需要一个单独的销毁路径,因为删除没有使用 html 表单,所以我的 web.php 文件是这样的:

use App\Http\Controllers\LocationController;
...
Route::resource('/locations', LocationController::class);
Route::get('/locations/destroy/location', [LocationController::class, 'destroy']);

但在这种情况下,如果我将use App\Http\Controllers\LocationController 放入第一行 (Route::resource...) 会失败,如果我将其删除,则第二行会失败。所以我删除了use 行并在第二行添加了App\Http\Controllers

Route::resource('/locations', LocationController::class);
Route::get('/locations/destroy/location', [App\Http\Controllers\LocationController::class, 'destroy']);

所以显然 Laravel 不会在 Route 的第二种形式中自动添加 App\Http\Controllers

【讨论】:

【参考方案7】:

在资源控制器描述中我从新项目中粘贴一个时出现此错误:

Route::resources([
'my_url' => LisseyDoruHisobotController:class,
..., //other controllers
]);

作为 Laravel 8 中的推荐签名,但目前正忙于 7 或 6 版本,应该在哪里:

Route::resources([
'my_url' => 'path\to\LisseyDoruHisobotController',
..., //other controllers
]);

否则会显示双倍路径

Laravel 目标类 [App\Http\Controllers\App\Http\Controllers\ ] 不存在

【讨论】:

以上是关于Laravel 目标类 [App\Http\Controllers\App\Http\Controllers\ApiController] 不存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8:目标类不存在[重复]

Laravel 绑定解析异常。目标类不存在[重复]

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

Laravel,该类存在,但我得到目标类 [PagesController] 不存在

Laravel 包开发 - 目标类 [ControllerName] 不存在

目标类 [AuthController] 不存在 Laravel 8 [重复]