【问题标题】: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']

标签: php laravel laravel-routing


【解决方案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\ ] 不存在

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-02-12
                • 2020-11-03
                • 1970-01-01
                • 1970-01-01
                • 2019-11-04
                • 2020-06-18
                • 2020-11-29
                相关资源
                最近更新 更多