首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何重写Backpack的UserCrudController?

如何重写Backpack的UserCrudController?
EN

Stack Overflow用户
提问于 2020-10-09 01:53:27
回答 3查看 1.3K关注 0票数 1

我正在尝试在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告诉我以下内容:

代码语言:javascript
运行
复制
|        | 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当前读数如下:

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

发布于 2020-10-09 03:54:03

我看不出你的代码有什么错误。可能是由于路由加载的顺序所致。基本上我和您做了同样的事情,但是我把crud路由放在了routes/backpack/permissionmanager.php

编辑:

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

由于您已经在routes/backpack/custom.php中定义了路由,因此我假设这些路由属于backpack基础包。由于composer在permissionmanager包之前加载了"backpack base“包,我希望来自permissionmanager的路由会重载来自"backpack base”包的路由。如果来自不同套餐的路由相互影响,则应由最后到达的套餐负责。

票数 1
EN

Stack Overflow用户

发布于 2020-10-09 17:46:50

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

代码语言:javascript
运行
复制
<?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');
});
票数 1
EN

Stack Overflow用户

发布于 2021-03-27 06:03:22

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

代码语言:javascript
运行
复制
    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);

      // ...
    }

不确定这是一种更好还是更糟糕的方法(?)。这样我就不需要更改任何背包路线或其他指向UserCrudController的代码。另外,我把我所有的重写都放在一个地方,这样我就不必在不同的文件中寻找。

不确定是不是更好,只是不同而已。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64268115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档