こんにちは。よっしーです(^^)
今日は、PHP-DIにおけるコンテナの設定についてご紹介します。
背景
PHP-DIに触れる機会がありましたので、PHP-DIにおけるコンテナの設定について備忘として残しました。
詳細は下記の公式サイトをご覧ください。
はじめに
PHP-DIのコンテナは「プラグアンドプレイ」のために事前に設定されています。以下のように簡単に使用を開始できます。
$container = new Container();
デフォルトでは、Autowiring(自動ワイヤリング)は有効になっています。また、属性(Attributes)はデフォルトで無効です。
配列を使用して定義を登録するには、
$container = new DI\Container([
// ここに定義を記述
]);
コンテナのオプションを変更するには、ContainerBuilderクラスを使用できます。
$builder = new \DI\ContainerBuilder();
$container = $builder->build();
本番環境
本番環境では、もちろん速度を優先するでしょう。
$builder = new \DI\ContainerBuilder();
$builder->enableCompilation(__DIR__ . '/tmp');
$builder->writeProxiesToFile(true, __DIR__ . '/tmp/proxies');
$container = $builder->build();
詳しくは下記のサイトをご覧ください。
軽量コンテナ
PHP-DIのコンテナを単純なコンテナとして使用したい場合(自動ワイヤリングやアノテーションのサポートなし)、すべての追加機能を無効にする必要があります。
$builder = new \DI\ContainerBuilder();
$builder->useAutowiring(false);
$builder->useAttributes(false);
$container = $builder->build();
ただし、これが必ずしもコンテナが速くなることを意味するわけではなく、すべてがキャッシュされる可能性があることに注意してください。詳細については、パフォーマンスのドキュメントを読んでください。
他のコンテナと一緒にPHP-DIを使用する
複数のコンテナを同時に使用したい場合、例えばPHP-DIをZF2やSymfony 2で使用する場合、Acclimateのようなツールを使用できます。
単にPHP-DIに対してコンポジットコンテナを参照するように伝える必要があります。そうしないと、PHP-DIはSymfonyのコンテナエントリを認識しないままになります。
Acclimateを使用した例:
$container = new Acclimate\Container\CompositeContainer();
// Add Symfony's container
$container->addContainer($acclimate->adaptContainer($symfonyContainer));
// Configure PHP-DI container
$builder = new \DI\ContainerBuilder();
$builder->wrapContainer($container);
// Add PHP-DI container
$phpdiContainer = $builder->build();
$container->addContainer($phpdiContainer);
// Good to go!
$foo = $container->get('foo');
おわりに
今日は、PHP-DIにおけるコンテナの設定についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント