我目前正在开发一个symfony应用程序,我希望在其中实现业务逻辑和框架的松耦合。我不想依赖于整个symfony框架,也许以后可以交换框架(并在bundle之外运行我的业务逻辑)。
Symfony DI Container是一个独立的组件,它可以在没有整个Symfony框架的情况下使用。所以我基本上可以处理我的依赖与这个组件(在一个yml文件,通过PHP等)。
假设我想使用jmsdiextrabundance配置带有注释的依赖项。是否有可能在symfony应用程序之外使用这个bundle ?如果没有,那么处理依赖项的最佳选择是什么?我想使用注释:)
- 用PHP, Yaml或其他任何东西配置容器,并且不需要注释
- 与Symfony容器一起使用另一个DI容器,它提供注释(例如PHP-DI)
- 不要从symfony中独立构建应用程序,也不要交换框架。
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非常棒,所以你可以使用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,这样一切都会简单得多。