2017-12-13 7 views
0

ユーザーを保存するテーブルがあります。ユーザーは学生、教師、校長、またはこれらの組み合わせのいずれかになることができます。私はこれを達成するために役割を利用します(spatie/laravel-permissionというパッケージ)。ロールに基づいてモデルを決定します。

私は学生、教師、ヘッドマスター向けの独自のロジック、クエリなどを使って特定のモデルを提供していますが、これらのモデルには特定のテーブルはありません。

ユーザーが教師モデルのブーツ()関数を(同じ学生や校長のために行く)を使用して、教師であれば、現在私が決める:

protected static function boot() 
    { 
     parent::boot(); 

     //Todo: make use of role package to determine if model is teacher or not. 
     static::addGlobalScope('teacher', function (Builder $builder) { 
      $builder->whereExists(function ($query) { 
       $query->select(DB::raw(1)) 
        ->from('teacher_offering') 
        ->whereRaw('teacher_offering.user_id = users.id'); 
      }); 
     }); 
    } 

このクエリはうまく動作しますが、私は場合は思っていました私はSpatieが提供するLaravel-permissionパッケージを利用してこれを単純化することができます。

私の質問は、教師の役割がユーザーに割り当てられているかどうかをチェックしてboot()関数内のクエリを置き換えることができますか?

このパッケージでこれを達成することはできますか?またはこのクエリにとどまるべきですか?

答えて

0

ユーザーの役割を確認するためのユースケースは何ですか?特定のページへのアクセスを防止する場合は、Middlewareを使用して役割を確認してください。私はスコープがこれに適しているとは思わない。

spatie/laravel-permissionパッケージには、あなたのUserHasRoles形質の実装と仮定すると、hasRole($role)方法を提供する。

$isTeacher = Auth::user()->hasRole('teacher'); 
+0

特定のページへのアクセスを防止するが、既にパッケージが提供するミドルウェアを使用することによって覆われています。 教師モデルでは、他のユーザーではなく教師がアクセスする必要がある特定の機能があるため、ユーザーに教師の役割がある場合、教師モデルを使用することです。 現在、ユーザーがデータベース内のクラスにリンクしているかどうかを確認します(教師モデルのboot()関数内)。私は、ユーザーが教師の役割を持っているかどうかをチェックするためにそれを変更したいと思います。 これは意味がありますか? –

+0

@ Y.Jacobs正直なところ、特定の「機能」を有効にすることは、Bladeテンプレート(特定のフォームやボタンを隠すなど)やコントローラ(FormRequestsなど)で行うことのように思えます。機能。もう一度、あなたのモデルはこのロジックをプログラムする場所ではありません。 – Jeffrey

関連する問題