【发布时间】:2020-02-01 12:32:25
【问题描述】:
我有一个具有以下实体/模型关系的多用户应用程序。
用户属于一个公司并且有很多SupportTicket
一家公司的用户不应访问其他公司的支持票 - 如果一家公司的用户导航到指向另一家公司的支持票的 url,他们应该会收到 404 或类似的信息。
我希望在 SupportTicket 类中定义一个全局范围,如下所示:
class SupportTicket extends Model {
protected $fillable = ['company_id'];
public static function boot() {
static::addGlobalScope('ofCompany', function(Builder $builder) {
$authUser = auth()->user();
$builder->where('company_id', $authUser->company_id);
});
}
}
全局范围的好处是它将适用于所有查询。在检索票证时,其他从事该项目的开发人员无需工作,因为始终会返回正确的结果。
例如SupportTicket::all() 或SupportTicket::find(5) 将始终限制用户公司的访问。
我现在面临的挑战是,auth()->user() 总是返回 null,因为身份验证中间件尚未运行。
- 有没有办法解决这个问题?
- 这里有没有人遇到过类似的问题,如果有,他们是如何解决的?
- 是否可以在注册了全局作用域的引导方法中访问认证用户?
非常感谢您的任何和所有回复。
【问题讨论】:
-
查看此链接 (laravel.com/docs/5.3/upgrade#5.3-session-in-constructors) 它讨论了如何在控制器构造函数中手动调用中间件,也许您可以使用它来手动运行中间件...
-
@Amade 感谢您指点我。从那个问题,我找到了解决方案。它链接到global scope issue on github,其中详细介绍了一个非常好的解决方案。
标签: php laravel-5.3