允许 Laravel 路由指定 `withTrashed`,尽管存在显式模型绑定

问题描述 投票:0回答:1

背景

在我的 Laravel 应用程序中,我有模型

Organization
Region
Location
,它们都通过
User
模型与
Assignment
模型具有多态关系。 (
Assignment
User
Role
和其他三个实体之一之间的三向关系,但这与此处的问题并不严格相关。)

我想向其他三个模型的每个控制器添加一个

showUsers
方法,以获取与该实体关联的所有用户。为了避免在所有三个控制器中复制粘贴相同的代码,我创建了一个像这样的
trait

use App\Http\Resources\UserSimpleWithRoleResource;
use App\Models\Assignment;
use Illuminate\Database\Eloquent\Model;

trait GetsRelatedUsers
{
    function listUsers(Model $model)
    {
        // Thanks to explicit model binding,
        // `$model` can be any supported model.

        $assignments = Assignment::with(['user:id,given_name,surname', 'role:id,name,display_order'])
            ->has('user') // prevents assignments for soft-deleted users from showing up
            ->atPlace($model) // a scope that also adds other conditions based on the provided model
            ->get();

        return UserSimpleWithRoleResource::collection($assignments);
    }
}

为了解析路由中的

Model $model
值,我需要在
RouteServiceProvider
boot
方法中具有显式模型绑定,如下所示:

Route::model('location', Location::class);
Route::model('region', Region::class);
Route::model('organization', Organization::class);

问题

在我的路线文件中,我设置了

Organization
Region
Location
的三个控制器,以允许查看和编辑软删除模型,如下所示:

Route::apiResource('organizations', \App\Http\Api\Organizations\Controller::class)->withTrashed(['show', 'update']);
Route::apiResource('regions', \App\Http\Api\Regions\Controller::class)->withTrashed(['show', 'update']);
Route::apiResource('locations', \App\Http\Api\Locations\Controller::class)->withTrashed(['show', 'update']);

在添加显式模型绑定之前,内置隐式模型绑定将检查路径是否存在

withTrashed
选项,并更改模型解析器以包含已废弃的项目。但是,显式绑定不会执行此检查。

除了在我的显式模型绑定中完全重新实现对

$route->allowsTrashedBindings()
的检查之外,是否有一种很好的方法来实现这一点,以便某些路由可以包含垃圾项目,而其他路由则不能?

php laravel eloquent soft-delete
1个回答
0
投票

我认为你可以在 RouteServiceProvider 中这样做

Route::bind('location', function ($value) {
    return Location::withTrashed()->where('id', $value)->firstOrFail();
});

请参阅此处:https://github.com/laravel/framework/issues/43008#issuecomment-1170673827

© www.soinside.com 2019 - 2024. All rights reserved.