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 我使用这种方法开发的。