2017-08-04 21 views
0

ここでは、フレームワークLaravelの例を示します。私は理解していない何PHP関数の依存関係はどのように機能しますか?

class UserController extends Controller 
{ 
    public function store(Request $request) 
    { 
     $name = $request->input("name"); 
    } 
} 

は要求を明示的にstore()の関数シグネチャ内で定義されていることです。

phpの型推論は関数に渡されていることを理解できませんでしたか?

これは依存性注入とも考えられますか?

+0

はい、関数に受け入れるデータ型を指定するだけです。クラス/関数は、そのオブジェクトをインスタンス化/作成する方法を知らない。さらに抽象化したい場合は、受け入れ可能なものを設定する際に汎用のインターフェースを使用してください。 – JimL

答えて

2

これはメソッドレベル依存性注入です。 Requestメソッドをstoreメソッドに渡していますが、メソッドの代わりにRequestオブジェクトの作成方法がわかっています。

メソッドシグネチャの型ヒントは2つのことを行います。

まず、プレーンなPHPのために、それはstoreメソッドに渡されたパラメータはRequestオブジェクト、またはRequestから継承オブジェクトでなければならないことを強制します。 store()メソッドをRequestオブジェクト(または子孫)以外のもので呼び出そうとすると、エラーが発生します。このため、厳密な型の施行の

は、我々は $requestパラメータが Requestオブジェクト(または子孫)でなければならないことを知っている、と私たちはそのパブリックインタフェースが使用可能であることに依存することができます( input()方法が存在することを知っています)。

第2に、Laravelの場合、このメソッドが必要とするオブジェクトのタイプをLaravelコンテナに伝えるので、正しいオブジェクトをコンテナから解決してメソッドに渡すことができます。コンテナを介してLaravelのコントローラメソッドが呼び出され、メソッド呼び出しの依存関係の自動解決が可能になります。

タイプヒントを削除すると、2つの問題が発生します。抽象レベルでは、任意のタイプのオブジェクト、またはスカラー値をstore()メソッドに渡すことができます。文字列にinput()を呼び出そうとすると、問題が発生します。より具体的なレベルでは、これはコントローラメソッドのLaravelの自動依存性解決を破ります。タイプヒントがなければ、Laravelはメソッドに必要なオブジェクトを知ることができないため、何も渡されません。nullにはinput()を呼び出すことができないというエラーが表示されます。ストアメソッドには1つのパラメータが必要ですが、わからない、テストしていません)。

関連する問題