我有一个应用程序,它将是一个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用户,但是当角色变得复杂时,是否有更简洁的方法来组装它?
答案 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);
}
}