Php 基于当前经过身份验证的用户的模型筛选器

Php 基于当前经过身份验证的用户的模型筛选器,php,laravel,laravel-5,laravel-5.5,Php,Laravel,Laravel 5,Laravel 5.5,我正在开发一个应用程序,其中每个用户都被分配了一个特定的区域。例如,用户1属于“Phoenix”区域,用户2属于“Scottsdale”,用户3属于“Tempe”。每个用户的区域在区域id列中定义 该应用程序为3种不同的用户模型提供了3个单独的防护。这是一个有区域经理、提供商和客户的市场。实际上,应用程序中的每个模型都有一个region_id列,用于标识资源所属的区域 我想简化资源的查询方式。目前,我直接在控制器中过滤每个模型/资源,例如: $customers = Customer::wher

我正在开发一个应用程序,其中每个用户都被分配了一个特定的区域。例如,用户1属于“Phoenix”区域,用户2属于“Scottsdale”,用户3属于“Tempe”。每个用户的区域在区域id列中定义

该应用程序为3种不同的用户模型提供了3个单独的防护。这是一个有区域经理、提供商和客户的市场。实际上,应用程序中的每个模型都有一个region_id列,用于标识资源所属的区域

我想简化资源的查询方式。目前,我直接在控制器中过滤每个模型/资源,例如:

$customers = Customer::where('region_id', Auth::user()->region_id);
我想在全局级别设置这样的过滤器,以确保每个经过身份验证的用户只能从自己的区域查看记录。这对于显示当前区域中的记录列表尤其重要,而不是检查用户是否可以访问/编辑特定的单个记录

我已经调查过了,但是我无法使用它们访问当前经过身份验证的用户。我可以访问当前用户的唯一情况是在闭包中定义了全局范围,但这违背了不必在每个模型中定义相同逻辑的目的,即我无法将过滤逻辑提取到查询范围类

什么是一个好的替代方法?如何根据当前已验证用户的属性设置全局模型过滤器?

制作一个RegionalModel并使用region\u id字段扩展所有模型如何?然后,在您的区域模型中创建一个类似于forUserUser$user的范围来应用您的过滤器

class RegionalModel extends Model {

    public function scopeForUser($query, User $user) {
        // Apply filter here
    }

}
那么您的客户模型可能是这样的

class Customer extends RegionalModel {

    // Code here

}
然后当你想得到一份客户名单时

$user = Auth::user();
$customers = Customer::forUser($user)->get();

我发布了一个类似的问题,因为一个可能的bug不确定这种行为是否是GitHub上Laravel Framework问题跟踪器所期望的,并在那里找到了答案

事实证明,您无法在全局查询范围构造函数中访问经过身份验证的用户,但可以在apply方法中访问该用户

因此,不是:

public function __construct() {
    $this->region_id = Auth::user()->region_id;
}

public function apply(Builder $builder, Model $model)
{
    $builder->where('region_id', $this->region_id);
}
我必须做:

public function apply(Builder $builder, Model $model)
{
    $region_id = Auth::user()->region_id;

    $builder->where('region_id', $region_id);
}

链接到GitHub上的问题。

只是为了确保我正确理解它:你是建议我声明所有模型都有多个关系,然后通过控制器中的RegionalModel访问它们?例如,在我的控制器中,我将使用:RegionalModel::find$region\u id->customers,而不是Customer::all?还是我完全误解了?当您需要为特定用户获取客户时,class Customer扩展了区域模型。您需要执行Customer::forUserAuth::user->get3的带有region\u id字段的模型已经扩展了Authenticatable类。我不确定这是否可行。你根本不必扩展你的可验证类。这3个模型都是保护提供者,但我想我明白你的意思。我可以简单地直接在他们身上重新实现Authenticatable类逻辑,即提取Authenticatable使用的3个特征,对吗?