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

Laravel Target class [App\Http\Controllers\App\Http\Controllers\ApiController] does not exist

出于某种原因,这可能是我的错,Laravel 认为它应该在路径中寻找 class 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');
});

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

要么删除这一行:

use App\Http\Controllers\ApiController;

或者在开头加一个\:

use \App\Http\Controllers\ApiController;

这应该有效:

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

无需添加 "use",因为控制器是从 App/Controllers 命名空间引用的,您可以在 RouteServiceProvider 上证实这一点。

您的路由语法是 "old syntax" 与 "new syntax"

的组合

您要实现的目标是:

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

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

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

在我的案例中,问题是在 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'));

在我的例子中(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

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

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

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

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

否则会显示双倍路径

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