Laravel控制器具有角色

时间:2017-05-21 09:28:40

标签: php laravel roles

我有一个应用程序,它将是一个SaaS并正在利用用户角色。当然,控制器需要根据用户角色或权限转发不同的数据,但我认为这种方法可能会让我变成巨大的控制器,我想知道是否有更聪明的方法来做到这一点?例如我的用户创建方法:

public function create()
{
    if (Auth::user()->isAdmin()) {
        $clinics = Clinic::pluck('name', 'id');
        $roles = Role::pluck('display_name', 'id');
    }
    else{
        $clinics = Clinic::where('id', Auth::user()->clinic_id)->get()->pluck('name', 'id');
        $roles = Role::where('name', '!=', 'admin')->get()->pluck('display_name', 'id');
    }

    $states = State::pluck('name', 'id');
    $cities = City::pluck('name', 'id');

    return view('users.create', compact('user', 'clinics', 'states', 'cities', 'roles'));
}

现在哪个我只实现了admin和非admin用户,但是当角色变得复杂时,是否有更简洁的方法来组装它?

1 个答案:

答案 0 :(得分:2)

我建议你看一下Laravel文档的Scopes。您可以将示波器附加到模型以获得相同的结果。

此解决方案不会帮助您删除代码复杂性(在模型中移动),但会帮助您删除代码重复,因为您将遇到相同的" if"在开发应用程序期间多次...

您诊所的当地范围可能就像这个

class Clinic extens Model {
    [...]
    public function scopeCanSee($query)
    {
        $user = Auth::user();
        if(!$user->isAdmin())
            return $query->where('id', $user->clinic_id);
        return $query;
    }
}

然后在您的控制器中,您可以按照这种方式过滤结果

public function create()
{
    $clinics = Clinic::canSee()->pluck('name', 'id');
    [...]

    $states = State::pluck('name', 'id');
    $cities = City::pluck('name', 'id');

    return view('users.create', compact('user', 'clinics', 'states', 'cities', 'roles'));
}

全球范围

另一种方法是使用全球范围(但我还没有测试过它们)

class Role extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new RolesScope);
    }
}
class Clinic extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new ClinicsScope);
    }
}

和范围类似于

class ClinicsScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $user = Auth::user();
        $builder->where('id', $user->clinic_id);
    }
}