ホームページ > バックエンド開発 > PHPチュートリアル > laravel' s IOCによる依存噴射

laravel' s IOCによる依存噴射

Lisa Kudrow
リリース: 2025-02-21 10:28:11
オリジナル
511 人が閲覧しました

laravel' s IOCによる依存噴射

開発者として、私たちは常に、新しいスタイルを採用し、デザインパターンを使用し、新しい堅牢なフレームワークを試すことにより、適切に設計されたクリーンなコードを書くための新しい方法を見つけようとしています。この記事では、LaravelのIOCコンポーネントを介して依存関係の注入設計パターンを調べて、それがどのように設計を改善できるかを確認します。

キーテイクアウト

    依存関係噴射(DI)は、ハードコーディングされた依存関係の分離を可能にする設計パターンであり、コードをより柔軟で、再利用可能で、テストしやすくします。 LaravelのIOC(制御の反転)では、オブジェクトに依存関係を作成するか、工場オブジェクトにそれらを作成するように依頼するのではなく、必要な依存関係を外部からオブジェクトに渡すことによって達成されます。
  • LaravelのIOCコンテナは、クラス依存関係を管理するための強力なツールです。さまざまなオブジェクトがどのように解決および作成されるかを制御します。クラスに依存関係がある場合、「自動配線」と呼ばれるプロセスを通じてクラスがインスタンス化されると、コンテナが自動的に注入します。
  • バインドメソッドを使用して、LaravelのIOCコンテナにサービスをバインドできます。この方法は、サービスを解決するときに使用されるクラスまたはインターフェイス名と、クラスのインスタンスを返す閉鎖の2つの引数を受け入れます。閉鎖はコンテナインスタンスを受信し、クラスをインスタンス化するために必要な他の依存関係を解決できるようにします。
  • LaravelのIOCコンテナでは、インターフェイスのバインディングも可能です。これにより、インターフェイスを特定の実装にバインドできます。次に、インターフェイスが要求されるたびに、コンテナがバインドされた実装を注入します。これにより、コードの柔軟性と再利用性がさらに向上します。
  • 依存関係噴射
  • 依存関係の注入は、Martin Fowlerによって造られた用語であり、アプリケーションにコンポーネントを注入する行為です。ウォード・カニンガムが言ったように:

依存関係注射は、アジャイルアーキテクチャの重要な要素です

例を見てみましょう:

このクラスをテストまたは維持する場合は、実際のデータベースにアクセスしてクエリを実行する必要があります。それをしなければならないことを避け、

クラスにコンポーネントを注入する場合、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(コントロールの反転)は、依存関係噴射を使用するために必要ではありませんが、依存関係を効果的に管理するのに役立ちます。 コントロールの反転

IOCは、依存関係の解決をより便利にする単純なコンポーネントです。コンテナにオブジェクトを説明し、クラスを解決するたびに依存関係が自動的に注入されます。

laravel ioc

Laravel IOCは、オブジェクトを要求するとき、依存関係を解決する方法で何らかの形で特別なものです。

この記事で改善する簡単な例を使用します。

SimpleAuthクラスにはfilessessionStorageの依存関係があるため、コードは次のようになる可能性があります。 laravel&#x27; s IOCによる依存噴射

これはそれを行う古典的な方法です。まず、コンストラクターの注入を使用してみましょう。


次に、オブジェクトを作成します:

<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>
ログイン後にコピー
依存関係を変更したので、simpleauthコンストラクターを変更し、新しいオブジェクトをコンテナにバインドする必要があります!

高レベルモジュールは、低レベルモジュールに依存してはなりません。両方

抽象化に依存する必要があります。

抽象化は詳細に依存してはなりません。詳細は

に依存する必要があります 抽象化について
<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>
ログイン後にコピー
ロバートC.マーティン

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インスタンスを取得します。ストレージサービスを切り替えたい場合は、バインディングを更新するだけです。
<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>
ログイン後にコピー
ログイン後にコピー
注:クラスがコンテナにバインドされているかどうかを確認する場合は、app :: bound( 'classname')を使用するか、app :: bindif( 'classname')を使用してバインディングを登録できます。既に登録されています。

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は1つのファイルにすぎないため、すべての機能を実行するのに時間がかかりません。 Laravel IOCまたはIOC全般についてもっと知りたいですか?お知らせください!
  • Laravelの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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート