背景
在我的Laravel应用程序中,我有模型Organization
、Region
和Location
,它们都通过一个Assignment
模型与User
模型存在多态关系.(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);
问题
在我的routes文件中,我设置了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()
的判断之外,有没有一种好的方法来实现这一点,以便一些路由可以包括垃圾项目,而其他路由则不能?