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

5

由于某种原因,可能是我的问题,Laravel认为它应该在路径 'App\Http\Controllers\App\Http\Controllers' 中查找类ApiController,因此... 它会重复寻找,但我不知道为什么。

这是一个崭新的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 - ceejayoz
为什么不直接使用Route::get('/base', 'ApiController@base')->name('base');呢? - Foued MOUSSI
2
我相信,'uses' => .... 添加默认名称空间。你可以使用 [ApiController::class , 'base'] 代替。 - Clément Baconnier
7个回答

8

我的问题在于,RouteServiceProvider中使用了路由命名空间

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

在Laravel 8中,命名空间被注释掉了因为我的网络路由没有完全移动到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'));

1
这应该能够工作:
Route::group(['prefix' => '/v1', 'as' => 'api'], function () {
    Route::get('base', 'ApiController@base')->name('base');
});

不需要添加"use",因为控制器是从App/Controllers名称空间引用的,您可以在RouteServiceProvider上进行证实。

1

您的路由语法是“旧语法”与“新语法”的结合。

您想要实现的目标是:

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

1
如果你想在路由器中使用 ::class 引用,应该这样做。
Route::group(['prefix' => '/v1', 'as' => 'api'], function () {
    Route::get('base', [ApiController::class, 'base'])->name('base');
});

0

当我在资源控制器描述中粘贴来自新项目的描述时,出现了这个错误:

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\]不存在


0

要么删除这行:

use App\Http\Controllers\ApiController;

或者在开头添加一个\

use \App\Http\Controllers\ApiController;

0
在我的情况下(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不会自动添加App\Http\Controllers到第二种形式的Route中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接