路由资源在 Laravel 8.x 中不工作

Route resource not working in Laravel 8.x

我对 Laravel 8.x 中的 Route::resource() 方法有疑问。 它 returns 的错误是:

Target class [Admin\App\Http\Controllers\Admin\ProfileController] does not exist.

这是我在 routes/web 中的代码。php:

Route::prefix('admin')->namespace('Admin')->group(static function() {

    Route::middleware('auth')->group(static function () {
        //...
        Route::resource('profile', ProfileController::class);
    });
});

我找不到问题所在。

请使用下面的代码,您似乎正在使用 class 而未导入,因此首先您需要在 web.php 文件中导入 profilecontroller。

use App\Http\Controllers\Admin\ProfileController;      ## insert path profilecontroller 
Route::prefix('admin')->namespace('Admin')->group(static function() {

    Route::middleware('auth')->group(static function () {
        //...
        Route::resource('profile', ProfileController::class);
    });
});

终于在laravel 8.x upgarade guide中找到了答案。我用完整的命名空间向控制器名称发送了短信,而不是导入它。

Route::prefix('admin')->namespace('Admin')->group(static function() {

    Route::middleware('auth')->group(static function () {
        //...
        Route::resource('profile', '\App\Http\Controllers\Admin\ProfileController');
    });
});

我在使用 Laravel 7 最新版本时也遇到了同样的问题。看看我是怎么解决的:

首先在页面包含这个目录
enter image description here 使用 \App\Http\Controllers\Admin\ProfileController

然后调用完整版本的路由,包括 class这样的名称

Route::resource('profile', '\App\Http\Controllers\Admin\ProfileController');

这将自动为 ProfileController class 中定义的所有方法创建不同的路由。使用 TodoController 查看所附图片中的示例。

Route::resource('invoice','\App\Http\Controllers\InvoiceController');

所以这是一个问题的原因是 Laravel 8 删除了 RouteServiceProvider 上的默认命名空间。

如果您想使用 ProfileController::class 功能,您需要在 RouteProvider 中将 protected $namespace 重置为 null 以匹配基本代码。

否则它会将 $namespace 添加到您传递的 class 中。

所以改变

protected $namespace = null

然后从您的 routes.php 文件中删除 ->namespace('Admin')

确保您遵循了升级指南。从 v7 到 v8 发生了很多变化。

App/Providers/RouteServiceProvider.php 添加 $namespace

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';
}

您还可以在这里找到更多答案:

运行 以下步骤用于清除路由缓存

php artisan route:clear

在 Laravel 8 中,首先,您必须像这样导入控制器,

use App\Http\Controllers\ProfileController;

然后使用资源,

Route::resource('profile', 'App\Http\Controllers\ProfileController');

如果您在 class、

中使用过它
Route::resource('profile',[ProfileController::class, 'classname']);

运行 php artisan route:list ,我遇到了同样的问题。

Target class [App\Http\Controllers\App\Http\Controllers\CourseController] does not exist.

就我而言,有效的方法是:

正在将资源从:Route::resource('courses', CourseController::class); 更改为 Route::resource('courses', 'CourseController');

我没有更改任何命名空间,我正在使用 laravel 7.2。