目次
コンストラクター メソッドの挿入
セッター メソッドの挿入
インターフェイス注入
利点
制御の反転
Laravel Ioc
ホームページ PHPフレームワーク Laravel Laravel における依存関係注入と IoC の詳細な紹介 (例付き)

Laravel における依存関係注入と IoC の詳細な紹介 (例付き)

Apr 11, 2019 pm 01:44 PM
laravel php

この記事では、Laravel での依存性注入と IoC について詳しく説明します (サンプル付き)。一定の参考価値があります。必要な友人は参照してください。お役に立てれば幸いです。

開発者として、私たちはデザイン パターンを使用したり、新しい堅牢なフレームワークを試したりすることで、適切に設計された堅牢なコードを作成する新しい方法を常に見つけようとしています。この記事では、Laravel の IoC コンポーネントを使用した依存性注入の設計パターンを調査し、それがどのように設計を改善できるかを見ていきます。

依存性注入

依存性注入という用語は、Martin Fowler によって提案された用語であり、アプリケーションにコンポーネントを注入する行為です。 Ward Cunningham 氏は次のように述べています:

依存性の注入はアジャイル アーキテクチャの重要な要素です。

例を見てみましょう:

class UserProvider{
    protected $connection;

    public function __construct(){
        $this->connection = new Connection;
    }

    public function retrieveByCredentials( array $credentials ){
        $user = $this->connection
                        ->where( 'email', $credentials['email'])
                        ->where( 'password', $credentials['password'])
                        ->first();

        return $user;
    }
}
ログイン後にコピー

このクラスをテストまたは保守したい場合は、データベースのインスタンスにアクセスしていくつかのクエリを実行する必要があります。これを回避するには、このクラスを他のクラスから 分離 することができます。Connection クラスを直接使用せずに挿入する 3 つのオプションのいずれかがあります。

コンポーネントをクラスに挿入するときは、次の 3 つのオプションのいずれかを使用できます。

コンストラクター メソッドの挿入

class UserProvider{
    protected $connection;

    public function __construct( Connection $con ){
        $this->connection = $con;
    }
    ...
ログイン後にコピー

セッター メソッドの挿入

同様に、 Setter メソッドを使用して依存関係を注入することもできます。

class UserProvider{
    protected $connection;
    public function __construct(){
        ...
    }

    public function setConnection( Connection $con ){
        $this->connection = $con;
    }
    ...
ログイン後にコピー

インターフェイス注入

interface ConnectionInjector{
    public function injectConnection( Connection $con );
}

class UserProvider implements ConnectionInjector{
    protected $connection;

    public function __construct(){
        ...
    }

    public function injectConnection( Connection $con ){
        $this->connection = $con;
    }
}
ログイン後にコピー

クラスがインターフェイスを実装するとき、依存関係を解決するために injectConnection メソッドを定義します。

利点

クラスをテストするときに、依存クラスをモックしてパラメーターとして渡すことができるようになりました。各クラスは特定のタスクに重点を置く必要があり、依存関係の解決には関心を持たないでください。こうすることで、より集中的で保守しやすいアプリケーションが作成されます。

DI についてさらに詳しく知りたい場合は、Alejandro Gervassio がこの連載記事で広範囲かつ専門的に取り上げていますので、必ずお読みください。では、IoCとは何でしょうか? IoC (制御の反転) では依存関係の注入を使用する必要はありませんが、依存関係を効果的に管理するのに役立ちます。

制御の反転

Ioc は、依存関係の解決を容易にする単純なコンポーネントです。オブジェクトをコンテナとして記述することができ、クラスが解決されるたびに依存関係が自動的に挿入されます。

Laravel Ioc

Laravel Ioc は、オブジェクトをリクエストするときに依存関係を解決する方法が少し特殊です:

Laravel における依存関係注入と IoC の詳細な紹介 (例付き)

私たちは A を使用します。この記事では、簡単な例でそれを改善します。
SimpleAuth クラスは FileSessionStorage に依存するため、コードは次のようになります:

class FileSessionStorage{
  public function __construct(){
    session_start();
  }

  public function get( $key ){
    return $_SESSION[$key];
  }

  public function set( $key, $value ){
    $_SESSION[$key] = $value;
  }
}

class SimpleAuth{
  protected $session;

  public function __construct(){
    $this->session = new FileSessionStorage;
  }
}

//创建一个 SimpleAuth
$auth = new SimpleAuth();
ログイン後にコピー

これは古典的なアプローチです。コンストラクター Function の使用から始めましょう。注射が始まります。

class SimpleAuth{
  protected $session;

  public function __construct( FileSessionStorage $session ){
    $this->session = $session;
  }
}
ログイン後にコピー

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

$auth = new SimpleAuth( new FileSessionStorage() );
ログイン後にコピー

Laravel Ioc を使用してこれらすべてを管理したいと思います。

Application クラスは Container クラスを継承しているため、App ファサードを通じてコン​​テナにアクセスできます。

App::bind( 'FileSessionStorage', function(){
    return new FileSessionStorage;
});
ログイン後にコピー

bind メソッドの最初のパラメータはコンテナにバインドされる一意の ID で、2 番目のパラメータは FileSessionStorage## が実行されるたびに実行されるコールバック関数です。 # クラスが実行されますが、以下に示すようにクラス名を表す文字列を渡すこともできます。

注: Laravel パッケージを見ると、バインディングが ( viewview.finder## など) のようにグループ化されていることがわかります。 # ...)。 セッション ストアを MySQL ストレージに変換すると仮定すると、クラスは次のようになります。

class MysqlSessionStorage{

  public function __construct(){
    //...
  }

  public function get($key){
    // do something
  }

  public function set( $key, $value ){
    // do something
  }
}
ログイン後にコピー

依存関係を変更したので、

SimpleAuth

も変更する必要があります。関数を構築し、新しいオブジェクトをコンテナにバインドします。 高レベルのモジュールは低レベルのモジュールに依存すべきではなく、両方とも抽象オブジェクトに依存する必要があります。

抽象化は詳細に依存すべきではなく、詳細は抽象化に依存する必要があります。
Robert C. Martin

私たちの
SimpleAuth

クラスは、ストレージがどのように行われるかを気にする必要はなく、代わりにサービスの利用に重点を置く必要があります。 したがって、ストレージを抽象的に実装できます:

interface SessionStorage{
  public function get( $key );
  public function set( $key, $value );
}
ログイン後にコピー

これにより、

SessionStorage

インターフェイスのインスタンスを実装して要求できます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class FileSessionStorage implements SessionStorage{   public function __construct(){     //...   }   public function get( $key ){     //...   }   public function set( $key, $value ){     //...   } } class MysqlSessionStorage implements SessionStorage{   public function __construct(){     //...   }   public function get( $key ){     //...   }   public function set( $key, $value ){     //...   } } class SimpleAuth{   protected $session;   public function __construct( SessionStorage $session ){     $this-&gt;session = $session;   } }</pre><div class="contentsignin">ログイン後にコピー</div></div>If

App::make('SimpleAuth')

を使用して、コンテナを通じて SimpleAuth クラスを解決します。コンテナは、問題を解決しようとして BindingResolutionException
をスローします。バインディングからのクラス その後、リフレクション メソッドに戻り、すべての依存関係を解決します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Uncaught exception 'Illuminate\Container\BindingResolutionException' with message 'Target [SessionStorage] is not instantiable.'</pre><div class="contentsignin">ログイン後にコピー</div></div>コンテナはインターフェイスをインスタンス化しようとしています。このインターフェースに特定のバインディングを作成できます。

App:bind( 'SessionStorage', 'MysqlSessionStorage' );
ログイン後にコピー

これで、コンテナからこのインターフェイスを解決しようとするたびに、

MysqlSessionStorage

インスタンスを取得します。ストレージ サービスを切り替えたい場合は、このバインディングを変更するだけです。 <p><strong>注:</strong> クラスがコンテナーにバインドされているかどうかを確認する場合は、<code>App::bound('ClassName') を使用するか、# を使用できます。 ##App::bindIf('ClassName') まだ登録されていないバインディングを登録します。

Laravel Ioc は、シングルトン バインディングを処理するための

App::singleton('ClassName', 'resolver') も提供します。
App::instance('ClassName', 'instance') を使用してシングルトン バインディングを作成することもできます。 コンテナが依存関係を解決できない場合、
ReflectionException がスローされますが、App::resolveAny(Closure) メソッドを使用して、次の形式で指定された型を解決できます。コールバック関数。

注: 特定の型の解決メソッドを登録している場合、resolveAny メソッドは引き続き呼び出されますが、直接 bind# を返します。 # # メソッドの戻り値。 ヒント

これらのバインディングを記述する場所:

これが単なる小さなアプリケーションの場合は、グローバル開始ファイル
global/start.php

, しかし、プロジェクトがどんどん大きくなると、サービスプロバイダーを利用する必要が出てきます。 テスト:

迅速かつ簡単なテストが必要な場合は、

php Artisan tinker

の使用を検討できます。これは非常に強力で、Laravel テスト プロセスの改善に役立ちます。 Reflection API: PHP の Reflection API は非常に強力です。Laravel Ioc を詳しく知りたい場合は、Reflection API に精通している必要があります。詳細については、まずこのチュートリアルを読んでください。 [関連する推奨事項:

PHP ビデオ チュートリアル

]

以上がLaravel における依存関係注入と IoC の詳細な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの目的:動的なWebサイトの構築 PHPの目的:動的なWebサイトの構築 Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

なぜPHPを使用するのですか?利点と利点が説明されました なぜPHPを使用するのですか?利点と利点が説明されました Apr 16, 2025 am 12:16 AM

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

See all articles