在 Laravel 8.x 中路由资源无法正常工作。

6
我在Laravel 8.x中使用Route::resource()方法时遇到了问题。 它返回的错误是:

目标类[Admin\App\Http\Controllers\Admin\ProfileController]不存在。

enter image description here

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

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

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

我找不到问题出在哪里。


1
确切地说,这里没有这个文件/类。请检查您是否正确命名,并且是否正确使用了命名空间。 - Vladan
1
我认为你只需要将 ProfileController::class 更改为 'App\Http\Controllers\Admin\ProfileController' - STA
9个回答

17

最终,我在 Laravel 8.x 升级指南 中找到了答案。我使用完整命名空间的控制器名称进行文本操作,而不是导入它。

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

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

7

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

php artisan route:clear

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

3

请确保您按照升级指南进行了操作。从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';
}

您也可以在这里找到更多答案:https://dev59.com/aVIG5IYBdhLWcg3wlifO#63808132


2

我也遇到了 Laravel 7 最新版本的同样问题。以下是我的解决方法:

首先,在页面上包含此目录:
enter image description here 使用 \App\Http\Controllers\Admin\ProfileController

然后像这样调用包括 className 的完整路由:

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

这将自动为ProfileController类中定义的所有方法创建不同的路由。请参见使用TodoController的附加图像中的示例。


请注意,当这个函数能够使用时,在Laravel 8.x的升级指南中路由部分中给出的解决方案是在RouteServiceProvider中将$namespace属性设置为null,就像下面建议的那样:https://dev59.com/cr3pa4cB1Zd3GeqPZjIj。 - gvd

2

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

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

在我的情况下,以下方法有效:

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

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


1
在 Laravel 8 中,首先,您需要导入控制器,例如:
use App\Http\Controllers\ProfileController;

然后使用该资源,

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

如果你在课堂上使用它,
Route::resource('profile',[ProfileController::class, 'classname']);

1

这个问题的原因是因为Laravel 8在RouteServiceProvider中删除了默认的命名空间。

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

否则,它将把$namespace前缀添加到您传递的任何类中。

所以请修改:

protected $namespace = null

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

-1
请使用以下代码,看起来您正在使用未导入的类,因此首先需要在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);
    });
});

我已经导入了这个类。 - Alisher Nasrullayev
你解决了吗? - Muhammad Rizwan Munawar

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