0

我目前正在开发一个 symfony 应用程序,我希望在其中实现业务逻辑和框架的松散耦合。我不想依赖整个 symfony 框架,以后也许可以交换框架(并在包之外运行我的业务逻辑)。

Symfony DI Container 是一个独立的组件,可以在没有整个 symfony 框架的情况下使用。所以我基本上可以用这个组件处理我的依赖项(在一个 yml 文件中,通过 PHP 等)。

假设,我想使用JMSDiExtraBundle配置带有注释的依赖项。有没有可能在 symfony 应用程序之外使用这个包?如果不是,那么处理我的依赖关系的最佳选择是什么?我想使用注释:)

  • 使用 PHP、Yaml 或其他任何东西配置容器,无需注释即可工作
  • 将另一个 DI 容器与 Symfony 结合使用,它提供注释(例如PHP-DI
  • 不要独立于 symfony 构建应用程序,也不要交换框架。
4

1 回答 1

1

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,一切都会简单得多。

于 2014-07-13T13:05:25.960 回答