シリンジ-PHPの宣言型IoCコンテナー

制御の反転は、コンピュータープログラム(Wikipedia)の接続を減らすために使用されるオブジェクト指向プログラミングの重要な原則です。



Pimpleのようにシンプル、Symfony DIのように強力



シリンジは、PHPで記述されたシンプルなIoCコンテナであり、多くの機能と宣言的な構成を備えています。



それは実装します:パラメータの実装、ファクトリーメソッド、インターフェース、スコープ、タグ実装、トリガーを含むインジェクションの主なタイプ。



さらなる機能について詳しく説明します。



最初の例



Fooクラスがあります。 そのコンストラクターは2つのパラメーターを取ります。



<?php class Foo { protected $a; protected $b; public function __construct($a, $b) { $this->a = $a; $this->b = $b; } }
      
      







構成内のサービスの説明は次のようになります。



 services: foo: class: 'Foo', arguments: ['value1', 'value2']
      
      







これで、fooサービスを要求すると、Fooクラスのインスタンスが作成されます。



 <?php // container init... $foo = $container->get('foo'); // Foo
      
      







Doctrineのデプロイ



より複雑な例は、プロジェクトでのDoctrineの使用を説明しています。



Fooクラスの操作には、データベース接続が必要です。



 <?php class Foo { protected $connection; public function __construct($connection) { $this->connection = $connection; } // ... }
      
      







アプリケーション構成は次のようになります。



 #   doctrine.configuration_paths: ['config/doctrine'] doctrine.db_parameters: driver: 'pdo_mysql' user: 'root' password: '1234' dbname: 'game' charset: 'UTF8' services: #  foo foo: class: 'Foo' arguments: ['@db_connection'] #   doctrine.setup_configuration: factoryStaticMethod: - 'Doctrine\ORM\Tools\Setup' - 'createAnnotationMetadataConfiguration' arguments: - '%doctrine.configuration_paths%' doctrine.entity_manager: factoryStaticMethod: - 'Doctrine\ORM\EntityManager' - 'create' arguments: - '%doctrine.db_parameters%' - '@doctrine.setup_configuration' alias: doctrine doctrine.connection: factoryMethod: - '@doctrine.entity_manager' - 'getConnection' alias: db_connection
      
      







fooサービスを要求すると、データベース接続がコンストラクター引数に渡されます。



 <?php // init container ... $foo = $container->get('foo');
      
      







ソース: SyringeExampleDoctrine



タグインジェクション



タグの実装は、サービスのリストを依存関係として使用できるようにする独自の機能の1つです。



この例では、Symfonyコンソールコンポーネントに基づいたコンソールアプリケーションを使用します。



 services: app: class: 'Symfony\Component\Console\Application' calls: - ['addCommands', ['#console_commands']] command.foo: class: 'Command\FooCommand' tags: console_commands command.bar: class: 'Command\BarCommand' tags: console_commands
      
      







console_commandsタグでマークされたサービスは、addCommands関数の引数としてリストされます。



ソース: SyringeExampleConsole



動作原理



コンテナー構成は、yaml、json、またはphp形式を使用して指定されます。

コンパイル時に、構成をphp配列に変換するプロセスが発生します。 変換された構成は、コンテナの起動に使用されるファイルにエクスポートされます。



コンパイルアルゴリズムは次のとおりです。

  1. 外部形式(例:yaml)からphp配列への変換、
  2. Builderに構成を追加し、
  3. パラメーターの依存関係の解決(%parameter.name%)、
  4. サービス構成からのパラメーターの分離、
  5. コレクター全体の構成の検証と配布、
  6. コレクターとパラメーターの構成をマージします。




その後、コンテナを使用する準備が整います。



未来



もちろん、SyringeはSymfony 2またはZend2のDI実装に取って代わるものではありません。これらは同じ機能を提供し、フレームワークと緊密に統合されています。



しかし、彼の目標はこれではありません。 そのニッチは、トップエンドのフレームワークがないところです。 IoCコンテナが統合されていないプロジェクトや、まだ選択されていない新しい軽量アプリケーション向けに設計されています。 そして、ここで彼は他のライブラリにオッズを与え、機能と利便性でそれらを追い越します。



プロジェクトの公式サイト: http : //butterfly.pro/components/dependency-injection



ご意見やご提案をいただければ幸いです!



UPD:開発に関連して、プロジェクトの名前がButterflyに変更され、Syringe IoC Containerがコンポーネントの1つになりました。



All Articles