Laravel 在方法启动后有条件地添加全局作用域
Laravel conditionally add global scopes after method boot
是否可以在模型已经通过构造函数后添加全局作用域?
我想捕捉一个事件(例如 creating
)并仅在模型正在创建时附加一个全局范围。
到目前为止我已经完成了:
Event::listen('eloquent.creating*', function ($event, $model) {
/**
* @var Model $eloquentModel
*/
$eloquentModel = $model[0];
$eloquentModel->addGlobalScope(new AuthorizationScope($event));
});
作用域构造函数被调用,但它的 apply
方法从未被激发,因为此时的模型显然已经通过了它激发作用域的部分。我怎么能手动触发它?
tl;博士;这不可能。在 Eloquent 事件触发时,范围已经加载并应用。
用例:我想在模型 create/edit/delete 上添加额外的范围,以便能够进行某种动态授权,但这无效,因为 Laravel 使用 Eloquent 查询用于执行 DB SELECT
的生成器。对于其他所有内容,例如插入或删除,会形成一个不同的查询,并且不会连接到给定的查询构建器,因此即使您可以利用它,这样做也没有任何意义,因为它会形成一个单独的查询 create/edit/delete 无论如何都要行动。
我最终做的是重用我在范围内使用的逻辑,而不是最初限制查询(范围做什么),我会在事件侦听器和 return true
/false
取决于那个支票。
对于这个具体示例,在捕获 eloquent.creating
事件后 returning false
将意味着不会创建模型,这正是我所需要的。
有关更多详细信息,请随时查看 authorization package for microservices 我使用这种方法开发的。
是否可以在模型已经通过构造函数后添加全局作用域?
我想捕捉一个事件(例如 creating
)并仅在模型正在创建时附加一个全局范围。
到目前为止我已经完成了:
Event::listen('eloquent.creating*', function ($event, $model) {
/**
* @var Model $eloquentModel
*/
$eloquentModel = $model[0];
$eloquentModel->addGlobalScope(new AuthorizationScope($event));
});
作用域构造函数被调用,但它的 apply
方法从未被激发,因为此时的模型显然已经通过了它激发作用域的部分。我怎么能手动触发它?
tl;博士;这不可能。在 Eloquent 事件触发时,范围已经加载并应用。
用例:我想在模型 create/edit/delete 上添加额外的范围,以便能够进行某种动态授权,但这无效,因为 Laravel 使用 Eloquent 查询用于执行 DB SELECT
的生成器。对于其他所有内容,例如插入或删除,会形成一个不同的查询,并且不会连接到给定的查询构建器,因此即使您可以利用它,这样做也没有任何意义,因为它会形成一个单独的查询 create/edit/delete 无论如何都要行动。
我最终做的是重用我在范围内使用的逻辑,而不是最初限制查询(范围做什么),我会在事件侦听器和 return true
/false
取决于那个支票。
对于这个具体示例,在捕获 eloquent.creating
事件后 returning false
将意味着不会创建模型,这正是我所需要的。
有关更多详细信息,请随时查看 authorization package for microservices 我使用这种方法开发的。