検索
ホームページバックエンド開発PHPチュートリアル独自の依存関係噴射コンテナを構築する方法

この記事では、単純な依存関係噴射コンテナ(DIコンテナ)PHPパッケージを構築する方法について説明します。 PHPDOCアノテーションや単体テスト(100%コードカバレッジ)を含む記事のすべてのコードは、GitHubリポジトリにアップロードされ、Packagistにリストされています。

How to Build Your Own Dependency Injection Container

キーポイント:

  • DIコンテナの構築は、開発者が依存噴射の基本原則とコンテナの作業メカニズムを理解するのに役立ちます。
  • diコンテナには、「依存噴射」と「コンテナ」という2つの主な機能があります。コンストラクターインジェクションまたはセッター噴射方法を使用して、インスタンス化してサービスを含める必要があります。
  • Symfony依存関係噴射コンテナは、カスタムコンテナを作成するための参照として使用できます。コンテナの構成をパラメーターとサービスに分割し、アプリケーションキーの安全なストレージを可能にします。
  • DIコンテナの作成には、プロジェクトディレクトリの作成、composer.jsonファイルの作成、コンテナの相互運用性インターフェイスの実装が含まれます。また、例外と参照クラスを作成することも含まれます。
  • コンテナクラスは、サービスを取得し、サービスが定義されているかどうかを確認する方法、パラメーターの解析、およびサービスの初期化のための方法を含める必要があります。また、円形の参照を防ぐための保護メカニズムも必要です。

依存関係噴射コンテナを計画します最初に、「依存関係噴射コンテナ」を「依存関係噴射」と「コンテナ」という2つの役割に分割します。

依存関係注入の最も一般的に使用される2つの方法は、コンストラクターインジェクションとセッターインジェクション、つまり、コンストラクターパラメーターまたはメソッド呼び出しを介してクラス依存関係を渡すことです。コンテナがインスタンス化してサービスを含めることができる場合、両方の操作を実行できる必要があります。

コンテナになるには、サービスのインスタンスを保存および取得できる必要があります。これは、サービスを作成するのに比べてかなり簡単な作業ですが、それでも検討する価値があります。

パッケージは、コンテナのセットが実装できるインターフェイスを提供します。メインインターフェイスは

です。これは、サービスが定義されているかどうかをテストするために、サービスを取得するための2つの方法です。 container-interop ContainerInterface

interface ContainerInterface
{
    public function get($id);
    public function has($id);
}
他の依存関係噴射コンテナを学習します

Symfony依存関係噴射コンテナを使用すると、さまざまな方法でサービスを定義できます。 YAMLでは、コンテナの構成が次のようになる場合があります:

Symfonyは、コンテナの構成をパラメーターとサービスに分割する方法に非常に役立ちます。これにより、APIキー、暗号化キー、認証トークンなどのアプリケーションキーが、ソースコードリポジトリから除外されたパラメーターファイルに保存されます。
parameters:
    # ...
    mailer.transport: sendmail

services:
    mailer:
        class:     Mailer
        arguments: ["%mailer.transport%"]
    newsletter_manager:
        class:     NewsletterManager
        calls:
            - [setMailer, ["@mailer"]]
PHPでは、Symfony依存関係インジェクションコンポーネントの同じ構成が次のとおりです。

オブジェクトを使用して、

へのメソッド呼び出しで、依存関係の注入ロジックは、この値を直接渡すべきではないことを検出できますが、コンテナ内のサービスIT参照に置き換える必要があります。これにより、混乱なくPHP値やその他のサービスをサービスに簡単に注入できます。
use Symfony\Component\DependencyInjection\Reference;

// ...
$container->setParameter('mailer.transport', 'sendmail');

$container
    ->register('mailer', 'Mailer')
    ->addArgument('%mailer.transport%');

$container
    ->register('newsletter_manager', 'NewsletterManager')
    ->addMethodCall('setMailer', array(new Reference('mailer')));

setMailerstartReference

最初に、新しいProjectディレクトリを作成し、Composerがクラスを自動的にロードするために使用できるファイルを作成します。現在、このファイルは、composer.json SitePointContainer src次に、コンテナをコンテナの相互運用性インターフェイスを実装するようにするため、作曲家にそれらをダウンロードして

ファイルに追加する必要があります:
interface ContainerInterface
{
    public function get($id);
    public function has($id);
}

composer.jsonメイン

に加えて、
parameters:
    # ...
    mailer.transport: sendmail

services:
    mailer:
        class:     Mailer
        arguments: ["%mailer.transport%"]
    newsletter_manager:
        class:     NewsletterManager
        calls:
            - [setMailer, ["@mailer"]]
パッケージは2つの例外インターフェイスも定義します。最初のものは、サービスを作成するときに遭遇する定期的な例外に使用され、要求されたサービスが見つからないときにもう1つが使用されます。また、要求されたパラメーターが見つからない場合、このリストに別の例外を追加します。

ContainerInterfacecontainer-interop(次のコンテンツでは、記事が長すぎてコアロジックが上記で説明されているため、コードの実装部分が省略されています。GitHubリポジトリの完全なコードには、例外クラス、参照クラス、およびコンテナの完全な実装が含まれています。クラス。)

概要

単純な依存関係噴射コンテナを作成する方法を学びましたが、まだ実装していない強力な機能を備えた他の多くのコンテナがあります!

PHP-DiやAura.diなどの一部の依存関係噴射コンテナは、Auto-Assemblyと呼ばれる機能を提供します。ここでは、コンテナがコンテナ内のどのサービスを他のサービスに注入する必要があるかを推測します。これを行うには、反射APIを使用してコンストラクターパラメーターに関する情報を見つけます。

好きなようにリポジトリを導き出し、自動アセンブリのような機能を追加できます。これは素晴らしい演習です!さらに、このコンテナのすべての既知のデリバティブバージョンの公開リストを保持して、他の人があなたがしていることを見ることができるようにします。以下のコメントを使用して作業を共有するだけで、必ず追加してください。

以下のコメントを使用してお問い合わせください。明確にしたり説明したりしたいもの、または見つけたエラーを教えてください。

(コンテンツが上記から非常に複製され、長すぎるため、FAQSセクションは省略されています。)

以上が独自の依存関係噴射コンテナを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
トラフィックの高いウェブサイトのPHPパフォーマンスチューニングトラフィックの高いウェブサイトのPHPパフォーマンスチューニングMay 14, 2025 am 12:13 AM

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

PHPでの依存関係注射:初心者向けのコード例PHPでの依存関係注射:初心者向けのコード例May 14, 2025 am 12:08 AM

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

PHPパフォーマンス:アプリケーションを最適化することは可能ですか?PHPパフォーマンス:アプリケーションを最適化することは可能ですか?May 14, 2025 am 12:04 AM

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

PHPパフォーマンスの最適化:究極のガイドPHPパフォーマンスの最適化:究極のガイドMay 14, 2025 am 12:02 AM

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

See all articles

ホット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

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

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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