PHP-DI 的作者在这里。你有什么理由要保留 Symfony 的容器吗?
您说您愿意将 PHP-DI 与 Symfony 的容器一起使用,所以仅供参考,可以与此处提供的文档进行集成。但是我认为它不适合你,因为它是与整个 Symfony 框架的集成。如果您想知道它是如何工作的,请查看GitHub 项目。
现在另一个可能更好的解决方案是同时使用 Symfony 的容器和 PHP-DI。您可以为此使用Acclimate。这是一个简单的例子(未经测试):
$sfContainer = /* ... */;
$phpdiContainer = /* ... */;
// Adapt Symfony's container. PHP-DI doesn't need this because it is compliant with
// Container Interop https://github.com/container-interop/container-interop
$acclimator = new ContainerAcclimator;
$sfContainer = $acclimator->acclimate($sfContainer);
$container = new CompositeContainer([$sfContainer, $phpdiContainer]);
在这里,复合容器 ( $container
) 将首先在 Symfony 的容器中查找服务,然后在 PHP-DI 的容器中查找。
现在的诀窍是每个容器都不知道另一个容器。所以如果使用 PHP-DI 的注解,就无法注入 Symfony 的服务。但是 PHP-DI 很棒(地狱是的:p),所以你可以让它知道父容器(这是复合容器)使用ContainerBuilder::wrapContainer()
:
$container = new CompositeContainer();
// Add Symfony's container
$container->addContainer($acclimate->adaptContainer($symfonyContainer));
// Configure PHP-DI container
$builder = new ContainerBuilder();
$builder->wrapContainer($container);
// Add PHP-DI container
$phpdiContainer = $builder->build();
$container->addContainer($acclimate->adaptContainer($phpdiContainer));
// Good to go!
$foo = $container->get('foo');
这取自PHP-DI 的文档。
现在世界上一切都很好。剩下的唯一问题是 Symfony 不知道 PHP-DI 的服务,但 Symfony 的容器没有等效的功能,所以没有办法解决这个问题(这太糟糕了)。根据我的经验,我认为这不是一个大问题。
但总而言之,我建议你只使用 PHP-DI,一切都会简单得多。