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

How to correctly instantiate a service from a Command in Symfony2

我在 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 参数有疑问。

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

首先"keys"不行。

一个好的配置应该是:

<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>

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

你的 getProductionManager 应该是这样的:

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