2016-08-17 9 views
7

Laravelコントローラで、すべての関数がRequestを使用する場合は、関数の代わりに直接コンストラクタに要求を挿入するのは正しいですか?それが正しいかどうそして、それは副作用を持っている場合、私はちょうど思っていたLaravel Request:コントローラーコンストラクターにリクエストを直接注入するのは正しいですか?

作品次のコード、...私に簡単に

class BananaController extends Controller 
{ 

protected $request; // request as an attribute of the controllers 

public function __construct(Request $request) 
{ 
    $this->middleware('auth'); 
    $this->request = $request; // Request becomes available for all the controller functions that call $this->request 
} 

public function store() 
{ 
    $this->validate($this->request, [ 
    'text' => 'required', 
    ]); 

    // I save the banana attributes and the controller continues... 

ゴー、これまで

:-) stackoverflowの上の最初の質問[補遺]明確にするため、「従来型」のコードは次のようになります。

class BananaController extends Controller 
{ 

public function __construct() 
{ 
    $this->middleware('auth'); 
} 

public function store(Request $request) 
{ 
    $this->validate($request, [ 
    'text' => 'required', 
    ]); 

    // I save the banana attributes and the controller continues... 
+0

マスター/子供のリクエストがあればどうなりますか?どちらがコンストラクタに注入されますか?その目的のために、symfonyはRequest自体の代わりにリクエストスタックサービスを注入することを提案します。 – mmmm

+0

「マスター/子供のリクエスト」とはどういう意味ですか?私はそれをgoogledしかしそれはまだ明確ではない... – TortelliEngineer

+0

小さなアプリでこれは大丈夫です。しかし、今後は大規模なアプリケーションでは、コントローラから検証と認可を分離する必要があります。あなたはたくさんの問題に直面するでしょう – KmasterYC

答えて

3

すべてまたはほとんどあなたのコントローラBananaControllerのメソッドのはRequestクラスを使用している場合依存関係を挿入する最も一般的な方法は、例のようにクラスのコンストラクタを使用する方法です。

コンストラクタ・インジェクションを使用することにはいくつかの利点があります。

  • は依存性が要件であり、クラスはそれなしで動作することはできません場合は、コンストラクタを介してそれを注入すると、クラスは次のように使用されたときに、それが存在している保証しますクラスなしではクラスを構築できません。

  • コンストラクタは、オブジェクトの作成時に一度しか呼び出されないため、オブジェクトの存続期間中に依存関係が変更されないことを確認できます。

これらの利点は、コンストラクタインジェクションがオプションの依存関係を処理するのに適していないことを意味します。また、クラス階層と組み合わせて使用​​することもより困難です。クラスがコンストラクタインジェクションを使用し、それを拡張し、コンストラクタをオーバーライドするのが問題になる場合。

+0

だから大丈夫です!すべてのメソッドがそれを使用するわけではありませんが、それらの大部分です!さらに、コンストラクタでは、認証済みのユーザーを確認する要求を必要とするDataRepositoryオブジェクトも挿入しますが、1つの質問で説明するのは少し複雑でした。 – TortelliEngineer

1

私は今、Laravel 5.3以降、

ただし、コントローラのコンストラクタを(ログインしているユーザーは、このリソースにアクセスすることを許可されているかどうかを確認するために、インスタンスのために)要求にすべての私のリソースコントローラルートを保護するために、同じ技術を使用していましたミドルウェアが実行される前に実行してください。実際にはがリクエスト内で壊れたルートモデルのバインドを行います。

Laravel docsのようなコントローラメソッドに直接リクエストを注入し、あなたにモデルをバインドしている場合は問題なく解決しますが、リクエストをコントローラコンストラクタに挿入して以下のようにリクエスト内でモデルにアクセスしてください。モデルの代わりにリソースIDだけが返されます。

//Route service provider 
Route::model('resource', MyModel::class); 
//Request class 
public function authorize() 
{ 
    //We expect to get a resource or null 
    //But now it just returns the resource id 
    if (!is_null($this->resource)) 
    { 
     return $this->resource->createdBy->id == $this->getLoggedUser()->id; 
    } 
} 
関連する問題