如何编辑软删除的已回收项?404错误技术求助
解决Backpack中编辑/查看软删除订单项的404问题
针对你遇到的访问软删除订单的/admin/orders/7/edit和/admin/orders/7/show页面出现404的问题,结合你已尝试的Trash Operation和自定义中间件,以下是具体的排查和修复步骤:
1. 确认模型和数据库的软删除基础配置
首先确保你的Order模型已正确启用软删除:
// app/Models/Order.php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Order extends Model { use SoftDeletes; // 必须添加这一行 protected $dates = ['deleted_at']; // Laravel 8+ 版本可省略 }
同时检查orders数据库表是否存在deleted_at字段(可为空的时间戳类型),如果没有需要生成迁移添加该字段。
2. 完善Trash Operation的配置
在你的OrderCrudController中,确保Trash Operation已正确注册,并且允许从回收站中操作模型:
// app/Http/Controllers/Admin/OrderCrudController.php use Backpack\CRUD\app\Http\Controllers\CrudController; class OrderCrudController extends CrudController { public function setup() { $this->crud->setModel(\App\Models\Order::class); $this->crud->setRoute(config('backpack.base.route_prefix').'/orders'); $this->crud->setEntityNameStrings('订单', '订单'); // 注册Trash Operation $this->crud->addOperation('trash', [ 'name' => 'trash', 'label' => '回收站', 'view' => 'backpack::crud.operation.trash', 'order' => 5, // 可选:设置操作按钮在列表中的排序位置 ]); } }
3. 修复自定义ResolveTrashedModelForBackpack中间件
确保你的中间件逻辑能正确解析软删除模型,并且已绑定到对应路由:
中间件实现
// app/Http/Middleware/ResolveTrashedModelForBackpack.php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class ResolveTrashedModelForBackpack { public function handle(Request $request, Closure $next) { $route = $request->route(); if (!$route) { return $next($request); } // 获取路由中的模型参数名 $parameterNames = $route->parameterNames(); if (empty($parameterNames)) { return $next($request); } $parameterName = $parameterNames[0]; // 获取当前Crud控制器绑定的模型类 $controller = $route->getController(); if (!method_exists($controller, 'crud')) { return $next($request); } $modelClass = $controller->crud->model; // 尝试从软删除记录中获取模型 $modelId = $route->parameter($parameterName); $model = $modelClass::withTrashed()->find($modelId); if ($model && $model->trashed()) { // 替换路由参数为软删除模型 $route->setParameter($parameterName, $model); } return $next($request); } }
注册中间件
在app/Http/Kernel.php中添加中间件注册:
protected $routeMiddleware = [ // ... 其他已存在的中间件 'backpack.resolve.trashed' => \App\Http\Middleware\ResolveTrashedModelForBackpack::class, ];
绑定到Edit/Show路由
在OrderCrudController中重写setupRoutes方法,为edit和show路由添加自定义中间件:
protected function setupRoutes($segment, $routeName, $controller) { // 调用父类方法生成默认路由 parent::setupRoutes($segment, $routeName, $controller); // 覆盖edit和show路由,添加自定义中间件 \Route::get($segment.'/{id}/edit', [ 'as' => $routeName.'.edit', 'uses' => $controller.'@edit', 'middleware' => ['backpack.auth', 'backpack.resolve.trashed'], ]); \Route::get($segment.'/{id}/show', [ 'as' => $routeName.'.show', 'uses' => $controller.'@show', 'middleware' => ['backpack.auth', 'backpack.resolve.trashed'], ]); }
4. 确保Edit/Show操作的查询包含软删除模型
在setupEditOperation和setupShowOperation方法中,明确指定查询范围包含软删除记录:
public function setupEditOperation() { // 覆盖默认查询,包含软删除模型 $this->crud->query = $this->crud->model::withTrashed(); // 其他字段配置... } public function setupShowOperation() { $this->crud->query = $this->crud->model::withTrashed(); // 其他字段配置... }
5. 检查权限配置(若使用Backpack权限系统)
如果你启用了Backpack的权限管理,确保当前登录用户拥有edit order和show order的权限,并且权限规则没有排除软删除的订单记录。
内容的提问来源于stack exchange,提问作者m yadav
相关产品推荐
相关产品推荐

