Laravel 如何覆盖背包';谁是用户crudcontroller?

Laravel 如何覆盖背包';谁是用户crudcontroller?,laravel,backpack-for-laravel,Laravel,Backpack For Laravel,我正在尝试覆盖/扩展Laravel 8中Backpack的默认UserCrudController,以便用我自己的操作替换列表和编辑操作。为此,我尝试: php artisan背包:crud用户 但是,除了“show”路由之外,app/Http/Controllers/Admin/UserCrudController.php中的新文件中的代码没有运行-可能是因为use\backack\CRUD\app\Http\Controllers\Operations\ShowOperation不存在于/v

我正在尝试覆盖/扩展Laravel 8中Backpack的默认UserCrudController,以便用我自己的操作替换列表和编辑操作。为此,我尝试:

php artisan背包:crud用户

但是,除了“show”路由之外,
app/Http/Controllers/Admin/UserCrudController.php中的新文件中的代码没有运行-可能是因为
use\backack\CRUD\app\Http\Controllers\Operations\ShowOperation
不存在于
/vendor/backpack/permissionmanager/src/app/Http/Controllers/UserCrudController.php
中,而它存在于我的新控制器中

php-artisan-route:list | grep-i用户
告诉我:

|        | GET|HEAD | api/user                |                                    | Closure                                                                                 | api                                                                             |
|        | POST     | user                    | user.store                         | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@store                | web                                                                             |
|        | GET|HEAD | user                    | user.index                         | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@index                | web                                                                             |
|        | GET|HEAD | user/create             | user.create                        | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@create               | web                                                                             |
|        | POST     | user/search             | user.search                        | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@search               | web                                                                             |
|        | PUT      | user/{id}               | user.update                        | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@update               | web                                                                             |
|        | DELETE   | user/{id}               | user.destroy                       | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@destroy              | web                                                                             |
|        | GET|HEAD | user/{id}/details       | user.showDetailsRow                | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@showDetailsRow       | web                                                                             |
|        | GET|HEAD | user/{id}/edit          | user.edit                          | Backpack\PermissionManager\app\Http\Controllers\UserCrudController@edit                 | web                                                                             |
|        | GET|HEAD | user/{id}/show          | user.show                          | App\Http\Controllers\Admin\UserCrudController@show                                      | web                                                                             |
我怎样才能使我的新控制器优先?我的
routes/backpack/custom.php
当前内容如下:

Route::group([
    'prefix'     => config('backpack.base.route_prefix', 'admin'),
    'middleware' => array_merge(
        (array) config('backpack.base.web_middleware', 'web'),
        (array) config('backpack.base.middleware_key', 'admin')
    ),
    'namespace'  => 'App\Http\Controllers\Admin',
], function () {
    // custom admin routes
    Route::crud('user', 'UserCrudController');
}); // this should be the absolute last line of this file

我看不出你的代码有错误。可能是因为路线的装载顺序。基本上我和你做的一样,但是我把crud路由放在
routes/backpack/permissionmanager.php

编辑:

我不知道具体的顺序,但是laravel项目中的web.php应该覆盖所有包路由。我希望包之间的顺序是“先进先出”,或者更好的是“后进后出”。因此,最后加载的包应该覆盖前一个包的路由


因为您已经在
routes/backpack/custom.php
中定义了路由,所以我假设这些路由属于背包基本包。由于composer在permissionmanager包之前加载了“backpack base”包,因此我希望permissionmanager的路由会使“backpack base”包的路由过载。如果来自不同包的路由相互作用,我认为最后一个包应该由谁负责。

通过将我的路由添加到routes/web.php而不是routes/backpack/custom.php解决了这个问题,这使得这个加载在权限包之前,因此优先。我添加的代码改编自custom.php中的代码:

<?php
Route::group([
    'prefix'     => config('backpack.base.route_prefix', 'admin'),
    'namespace'  => 'App\Http\Controllers\Admin',
], function () {
    // routes to override others from Backpack
    Route::crud('user', 'UserCrudController');
});

我知道我比赛迟到了,但我想提供一种不同的方式来使用自定义用户CRUD控制器。我不需要添加或更改任何路线。只需在register()方法下的
app/Providers/AppServiceProvider
中添加一行即可

不确定这是更好还是更糟的方法(?)。它只是使我不必更改任何背包路线或指向UserCrudController的其他代码。另外,我在一个地方有我所有的覆盖,所以我不必去寻找不同的文件


不确定是否更好,只是有所不同。

嗯。拉雷维尔8号有什么变化吗?是什么决定了路由和控制器的加载顺序,以便我可以尝试反向加载?我也会这样做。我不指望Laravel加载路由文件的顺序,而是使用上面Flo Espen所说的,并有一个
routes/backpack/permissionmanager.php
文件。这样你就可以超级肯定只有你想要的路线才能被载入。或者,您可以bing您的控制器来替换它-看看如果您像我之前建议的那样将路由放在routes/backpack/permissionmanager.php中,它会不会工作?
    public function register() {
      //Bind original crud controller to a custom controller
      $this->app->bind(\Backpack\PermissionManager\app\Http\Controllers\UserCrudController::class, \App\Http\Controllers\Admin\UserCrudController::class);

      // ...
    }