2017-10-23 14 views
0

私は、プロジェクトの個々のモデルコントローラによって拡張された抽象コントローラクラスを使用しています。Laravelコントローラでモデルを動的に指定する

現在、各モデルコントローラは、モデルのクラスをコンストラクタに設定します。これは、アブストラクトが適切なオブジェクトをロードするために使用します。

だから、簡単な例を取るために、私の抽象は

public function show($id){ 
    $object = $this->model::findOrFail($id); 
    $this->authorize('view', $object); 
    return view($this->view_dir.'.show',$object); 
} 

を持っており、私のRefereeクラスが

public function __construct(){ 
    $this->middleware('auth'); 
    $this->model = 'App\Referee'; 
    $this->view_dir = 'referees' 
} 

これが正常に動作しているが、私は希望を含みコンストラクタで、それを拡張コントローラー・メソッド内の各アクションを手動で許可するのではなく、許可ミドルウェアを使用するように切り替えます。

私はそれを理解するために、showメソッドをモデルでタイプヒントする必要がありますが、これは抽象のプロパティとしてのみ利用できます(動的タイプヒントを持つことはできません) 。

モデルをコントローラにバインドする別の方法はありますか?私は理想的には、子クラスのコンストラクタであると考えます。コントローラメソッドでモデルをTypehinting

答えて

0

Route model bindingのためである、あなたは

Route::get('books/{book}', '[email protected]'); 

のようなルートを作成するときではない、許可

ルートモデルバインディングがあり、あなたのコントローラのメソッドは

public function show(Book $book) 
{ 
    // here $book is already the model instance, not the id. It throws 404 automatically if can't find the book by the primary key 
} 
になります

文書でこれを見たとき

$this->authorize('update', $post); 

それはあなたがそれを行う必要があるリソース(モデル、ないDB上の記録)でアクションを許可するには、あなたがポストインスタンスの許可をチェックしているためです(DB上の記録ではなく、モデル)

次のようにします:

$this->authorize('create', Post::class); 
+0

私はこれをすべて理解していますが、モデル上でauthorizeメソッドを呼び出すのではなく、コントローラメソッドのミドルウェアで承認を実装したいと言っています(https: //laravel.com/docs/5.5/authorization#via-middleware)。 私はこれを実現する従来の方法として説明している方法を理解していますが、私の 'show'メソッドは抽象クラスです。すべてのモデルで呼び出されるので、明示的に型を宣言できませんあなたの例では '$ book'です。 '$ book'はどのクラスが要約を拡張しているかによって異なる必要があります。 – rhoward

+0

継承を使用してコントローラコンストラクタでauthorizeを使用する – Lloople

関連する問題