You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编辑软删除的已回收项?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:33:33