Symfony将所有捆绑参数注入DI服务

时间:2017-01-19 04:07:13

标签: php symfony dependency-injection parameters

我正在使用Symfony并尝试创建一个服务,其中包含我们在AppBundle中的parameters.xml中设置的所有应用程序参数。

我最后一次将ServiceContainer注入服务并使用 - > get('param_name')就可以了,虽然我知道注入整个容器是非常糟糕的做法。

有没有办法可以将所有参数注入我的服务而不必将它们作为arg添加到服务定义中?

上一个项目我本质上是这样做的

服务定义

<service id="myapp.application_parameters" class="AppBundle\DependencyInjection\Service\ApplicationParametersService">
    <argument type="service" id="service_container" />
</service>

服务类

namespace AppBundle\DependencyInjection\Service;

use Symfony\Component\DependencyInjection\ContainerInterface;

class ApplicationParametersService
{
    private $_container;
    protected $developmentEmail;

    function __construct(ContainerInterface $container)
    {
        $this->_container = $container;

        $this->developmentEmail = $this->_container->getParameter('myapp.dev.email');

    }

public function getDevEmail()
{
    return $this->developmentEmail;
}

1 个答案:

答案 0 :(得分:0)

你说得对:在大多数情况下,注射容器是反模式的。但是注入所有参数也是一个不好的做法:您不确切知道服务实际使用了哪些参数,因为它可以访问所有参数。 当代码只获得它真正需要的值时,它会更好。

如果这种方式可以接受并且您只需要减少样板代码,那么您可以使用父服务或自动装配。

1)parent service

<service id="generic_service" abstract="true">
    <!-- it's better than whole container -->
    <argument type="service" id="myapp.application_parameters"/>
</service>

<service id="specific_service_a" class="..." parent="generic_service"/>
<service id="specific_service_b" class="..." parent="generic_service"/>

2)使用自动装配:

<service id="specific_service_a" class="..." autowire="true">

至少你可以通过global variable获取容器。风险最大的方式,但它确实有效。