2017-05-21 9 views
1

私はSaaSになり、ユーザの役割を利用するアプリケーションを持っています。もちろん、コントローラーはユーザーの役割やアクセス許可に応じて異なるデータを転送する必要がありますが、この方法は巨大なコントローラーにつながる可能性があります。これを行うにはもっとスマートな方法があるのでしょうか?ロールを持つLaravelコントローラ

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')); 
} 

私は唯一の管理者と非管理者ユーザーを実装したときに、今は大丈夫ですが、役割が複雑になりますと、これを組み立てるきれいな方法があります:?例えば、私のユーザーは、メソッドを作成しますか

+0

に似スコープユーザーの役割をチェックします。 – Sandeesh

答えて

2

LaravelドキュメントのScopesをご覧ください。スコープをモデルにアタッチすると、同じ結果が得られます。

このソリューションを使用すると、コードの複雑さを削除する助けにはなりません(それはモデルに移動させる)が、アプリケーションの開発中に複数回...

「場合」あなたは同じが発生しますので、あなたがコードの重複を取り除くのに役立ちますあなたの診療所のための

ローカルスコープは、この1

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')); 
} 
012で結果をフィルタリングすることができますグローバルスコープ

もう一つの方法は、(私はそれらをテストしていません)

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); 
    } 
} 
+0

IDだけでフィルタリングしたいのであれば、モデル間でコードを複製する必要があります。 – Norgul

+0

あなたは何を意味するのか正確に教えてもらえますか? –

+0

@ Norgulでは、スコープにパラメータを渡すことができるため、異なるIDに単一のスコープを再利用できます。 – Sandeesh

関連する問題