如何重写 Backpack 的 UserCrudController?

Tri*_*dis 3 laravel laravel-backpack

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

php artisan backpack:crud User

但是,除了“显示”路线之外,新文件中的代码app/Http/Controllers/Admin/UserCrudController.php并未运行 - 可能是因为它use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;不存在于/vendor/backpack/permissionmanager/src/app/Http/Controllers/UserCrudController.php我的新控制器中,而它存在于我的新控制器中。

php artisan route:list | grep -i user告诉我以下内容:

|        | 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                                                                             |
Run Code Online (Sandbox Code Playgroud)

我怎样才能让我的新控制器优先?我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
Run Code Online (Sandbox Code Playgroud)

Che*_*key 7

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

    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);

      // ...
    }
Run Code Online (Sandbox Code Playgroud)

不确定这是更好还是更坏的方法(?)。它只是做到了这一点,所以我不必更改任何 Backpack 路由或指向 UserCrudController 的其他代码。另外,我将所有覆盖都集中在一个地方,因此我不必在不同的文件中寻找。

不确定哪个更好,只是不同。