如何从Symfony2中的命令正确实例化服务

时间:2015-02-16 12:29:46

标签: symfony dependency-injection containers symfony-2.6

我在Symfony2中有一个需要ProductManager服务的命令。

我将两个参数传递给此服务:Doctrine的实体管理器和来自app/config/config.yml的配置数组

这是捆绑中的services.xml

<service id="acme.product_manager" class="Acme\ApiBundle\ProductManager" public="true">
    <argument>'@doctrine.orm.entity_manager'</argument>
    <argument>"keys"</argument>
</service>

以下是命令中的代码:

protected function execute(InputInterface $input, OutputInterface $output)
{
    $productManager = $this->getProductManager();
}

public function getProductManager()
{
    $em = $this->getContainer()->get('doctrine')->getManager();
    $config = $this->getContainer()->getParameter('acme_api.config');
    $keys = $config['keys']['beta_keys'];

    $productManager = new ProductManager($em, $keys);

    return $productManager;
}

app/config/config.yml中的配置:

acme_api:
    keys:
        beta_keys:
            app_key:  "XXXXXX"
            rest_api_key: "YYYYYY"

最后是服务构造函数:

public function __construct(EntityManager $em, $keys)
{
}

我认为实体管理器已正确注入服务中,但我对keys参数有疑问。

是否也应该注入(就像我现在这样做),或者以某种方式从服务内部检索配置以避免每次实例化时将其作为参数传递更好?

1 个答案:

答案 0 :(得分:2)

首先&#34;键&#34;不会工作。

一个好的配置是:

<service id="acme.product_manager" class="Acme\ApiBundle\ProductManager" public="true">
    <argument type="service" id="doctrine.orm.entity_manager" />
    <argument>%acme_api.keys%</argument>
</service>

此外,当您使用DIC在xml / yml中定义服务时,它是为了避免在您的函数getProductManager中自行完成。

你的getProductionManager应该是:

private function getProductManager()
{
    //as defined in you services.xml
    return $this->getContainer()->get('acme.product_manager');
}