開発者として、私たちは常に、新しいスタイルを採用し、デザインパターンを使用し、新しい堅牢なフレームワークを試すことにより、適切に設計されたクリーンなコードを書くための新しい方法を見つけようとしています。この記事では、LaravelのIOCコンポーネントを介して依存関係の注入設計パターンを調べて、それがどのように設計を改善できるかを確認します。
キーテイクアウト例を見てみましょう:
このクラスをテストまたは維持する場合は、実際のデータベースにアクセスしてクエリを実行する必要があります。それをしなければならないことを避け、クラスにコンポーネントを注入する場合、3つのオプションのいずれかを使用できます。 コンストラクターインジェクション
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>$this->connection = new Connection; </span> <span>} </span> <span>public function retrieveByCredentials( array $credentials ){ </span> <span>$user = $this->connection </span> <span>->where( 'email', $credentials['email']) </span> <span>->where( 'password', $credentials['password']) </span> <span>->first(); </span> <span>return $user; </span> <span>} </span><span>}</span>
セッターインジェクション
同様に、セッターメソッドを使用して依存関係を挿入できます。インターフェイスインジェクション
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
さて、クラスをテストするとき、依存関係のクラスをmockしてパラメーターとして渡すことができます。各クラスは特定のタスクに焦点を合わせている必要があり、依存関係の解決に関心を持ってはなりません。そうすれば、あなたはより良い集中と保守可能なアプリケーションを持っているでしょう。
DIについてもっと知りたい場合は、Alejandro Gervassioがこのシリーズで広範囲に職業的にカバーしているので、これらの記事を読んでください。さて、IOCはどうですか? IOC(コントロールの反転)は、依存関係噴射を使用するために必要ではありませんが、依存関係を効果的に管理するのに役立ちます。 コントロールの反転
Laravel IOCは、オブジェクトを要求するとき、依存関係を解決する方法で何らかの形で特別なものです。
この記事で改善する簡単な例を使用します。
SimpleAuthクラスにはfilessessionStorageの依存関係があるため、コードは次のようになる可能性があります。
次に、オブジェクトを作成します:
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>$this->connection = new Connection; </span> <span>} </span> <span>public function retrieveByCredentials( array $credentials ){ </span> <span>$user = $this->connection </span> <span>->where( 'email', $credentials['email']) </span> <span>->where( 'password', $credentials['password']) </span> <span>->first(); </span> <span>return $user; </span> <span>} </span><span>}</span>
今、私はLaravel IOCを使用してそのすべてを管理したいです。
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
BINDメソッドの最初のパラメーターは、コンテナにバインドする一意のIDです。2番目は、filessessionStorageクラスを解決するたびに実行されるコールバック関数です。次に。
<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function setConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>
注:Laravelパッケージを検査すると、バインディングがグループ化されることがあります(view、view.finder ..)。
>セッションストレージをmysqlに切り替えたいと思うかもしれませんが、クラスは次のようになります。
<span>interface ConnectionInjector{ </span> <span>public function injectConnection( Connection $con ); </span><span>} </span> <span>class UserProvider implements ConnectionInjector{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function injectConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span><span>}</span>
高レベルモジュールは、低レベルモジュールに依存してはなりません。両方
抽象化に依存する必要があります。抽象化は詳細に依存してはなりません。詳細は
に依存する必要があります 抽象化について<span>class FileSessionStorage{ </span> <span>public function __construct(){ </span> <span>session_start(); </span> <span>} </span> <span>public function get( $key ){ </span> <span>return $_SESSION[$key]; </span> <span>} </span> <span>public function set( $key, $value ){ </span> <span>$_SESSION[$key] = $value; </span> <span>} </span><span>} </span> <span>class SimpleAuth{ </span> <span>protected $session; </span> <span>public function __construct(){ </span> <span>$this->session = new FileSessionStorage; </span> <span>} </span><span>} </span> <span>//creating a SimpleAuth </span><span>$auth = new SimpleAuth();</span>
SimpleAuthクラスは、ストレージの完了方法を心配してはいけません。代わりに、サービスの消費だけに焦点を当てる必要があります。したがって、ストレージの実装:
を抽象化できます
この方法では、SessionStorageインターフェイスのインスタンスを実装して要求することができます。<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>$this->connection = new Connection; </span> <span>} </span> <span>public function retrieveByCredentials( array $credentials ){ </span> <span>$user = $this->connection </span> <span>->where( 'email', $credentials['email']) </span> <span>->where( 'password', $credentials['password']) </span> <span>->first(); </span> <span>return $user; </span> <span>} </span><span>}</span>ログイン後にコピーログイン後にコピーログイン後にコピー コンテナはインターフェイスをインスタンス化しようとしています。インターフェイスに特定のバインディングを作成することで、それを修正できます。<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>ログイン後にコピーログイン後にコピーログイン後にコピーコンテナを介してインターフェイスを解決しようとするたびに、mySqlSessionStorageインスタンスを取得します。ストレージサービスを切り替えたい場合は、バインディングを更新するだけです。
注:クラスがコンテナにバインドされているかどうかを確認する場合は、app :: bound( 'classname')を使用するか、app :: bindif( 'classname')を使用してバインディングを登録できます。既に登録されています。<span>class UserProvider{ </span> <span>protected $connection; </span> <span>public function __construct(){ </span> <span>... </span> <span>} </span> <span>public function setConnection( Connection $con ){ </span> <span>$this->connection = $con; </span> <span>} </span> <span>...</span>ログイン後にコピーログイン後にコピーLaravel IOCは、共有バインディング用のApp :: Singleton( 'className'、 'Resolver')も提供しています。
App :: Instance( 'className'、 'instance')を使用して、共有インスタンスを作成することもできます。
コンテナが依存関係を解決できない場合、それはReflectionExceptionをスローしますが、アプリ:: Resolveringany(閉鎖)を使用して、特定のタイプまたはフォールバックの形式として解決できます。注:特定のタイプのリゾルバーを登録すると、Resolveringanyメソッドも呼び出されますが、BINDメソッドの値は返されます。
最終的なヒント
バインディングを保存する場所:
わずかなアプリケーションがある場合は、Global/start.phpを使用できますが、プロジェクトが大きくなっている場合は、サービスプロバイダーを使用する必要があります。テスト:
テストしている場合は、PHP Artisan Tinkerの使用を検討する必要があります。それは非常に強力であり、Laravelテストワークフローを増やすことができます。反射API:
- PHPリフレクションAPIは非常に強力であり、Laravel IOCを理解したい場合は、リフレクションAPIに精通する必要があります。詳細については、必ずこのチュートリアルを確認してください。
結論
- LaravelのIOC
いつものように、何かについて学ぶ最良の方法は、ソースコードを検査することです。 Laravel IOCは1つのファイルにすぎないため、すべての機能を実行するのに時間がかかりません。 Laravel IOCまたはIOC全般についてもっと知りたいですか?お知らせください!- での依存関係注射に関するよくある質問
LaravelのIOCでの依存噴射の主な目的は何ですか?LaravelのIOC(コントロールの反転)の依存関係注入は、ハードコーディングされた依存関係の分離を可能にする設計パターンです。これは、オブジェクトに依存関係を作成したり、工場のオブジェクトを作成するように依頼する代わりに、必要な依存関係を外部からオブジェクトに渡すことを意味します。これにより、クラスの外部からの依存関係を制御できるため、コードがより柔軟になり、再利用可能で、テストが容易になります。LaravelのIOCコンテナはどのように機能しますか?
LaravelのIOCコンテナは、クラス依存関係を管理するための強力なツールです。さまざまなオブジェクトがどのように解決および作成されるかを制御します。クラスに依存関係がある場合、クラスがインスタンス化されると、コンテナが自動的に注入します。これは、「自動配線」と呼ばれるプロセスを通じて行われます。コンテナはクラスを検査して依存関係を自動的に決定します。 LaravelのIOCコンテナにサービスをバインドすると、Bindメソッドを使用できます。この方法は、サービスを解決するときに使用されるクラスまたはインターフェイス名と、クラスのインスタンスを返す閉鎖の2つの引数を受け入れます。閉鎖によりコンテナインスタンスが受信され、クラスをインスタンス化するために必要な他の依存関係を解決できます。 LaravelのIOCコンテナのシングルトンは、インスタンスの管理方法にあります。サービスにバインドすると、解決するたびにサービスの新しいインスタンスが作成されます。一方、Singletonを使用すると、サービスが解決されるたびに同じインスタンスが返されます。 LaravelのIOCコンテナから、Make Methodを使用できます。この方法は、その議論として解決するためにサービスの名前を受け入れます。サービスがコンテナにバインドされている場合、すべての依存関係が自動的に注入された状態で、サービスのインスタンスを返します。コードをより柔軟で分離することにより、Laravelでテストします。これは、テスト中にモックオブジェクトと依存関係を簡単に交換できることを意味します。これにより、テスト中のコードを隔離し、テスト環境を制御しやすくなります。
LaravelのIOCコンテナでインターフェイスバインディングを使用できますか? 。これにより、インターフェイスを特定の実装にバインドできます。次に、インターフェイスが要求されるたびに、コンテナはバインドされた実装を挿入します。
LaravelのIOCコンテナは自動解像度をどのように処理しますか?クラスの。クラスを解決しようとすると、コンテナはクラスが必要とするすべての依存関係を自動的に構築および注入します。コンテナは、関連するIOC登録を単一の場所でグループ化する方法です。彼らはあなたのアプリケーションを構成するための中心的な場所です。すべてのLaravelアプリケーションには、コアサービスのために多くのサービスプロバイダーが箱から出しています。LaravelのIOCコンテナにサービスプロバイダーを登録するにはどうすればよいですか?
LaravelのIOCコンテナにサービスプロバイダーを登録するには、config/app.php構成ファイルのプロバイダー配列に追加できます。サービスプロバイダーが登録されると、アプリケーションがブートストラップされると、Laravelによってブートストラップされます。
以上がlaravel&#x27; s IOCによる依存噴射の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。