Symfony2扩展,replaceArgument

时间:2016-04-11 15:55:50

标签: php symfony

我正在使用Symfony2,而我正试图设置服务定义覆盖。

扩展已加载correclty,但服务定义未更改。

以下是代码:

class AppExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        $container->setParameter('app.comment.delay_between', $config['comment']['delay_between']);

        $def = $container->getDefinition('app.comment.manager')
            ->replaceArgument(0, $config['comment']);

        $container->setDefinition('app.comment.manager2', $def);
    }

    /**
     * {@inheritdoc}
     */
    public function getAlias() {
        return 'app';
    }
}

服务定义:

app.comment.manager:
    class: AppBundle\Comment\CommentManager
    arguments:
        - []
        - "@doctrine.orm.entity_manager"

类CommentManager的构造函数:

/**
 * CommandManager constructor.
 * @param array $config
 * @param EntityManagerInterface $em
 */
public function __construct(array $config, EntityManagerInterface $em) {
    $this->config = $config;
    var_dump($config);
    $this->em = $em;
}

在控制器中我打电话:

$this->get('app.comment.manager');
$this->get('app.comment.manager2');

我得到了这个结果:

/home/nathan/Dev/click-tube/src/symfony/src/AppBundle/Comment/CommentManager.php:37:
array (size=0)
  empty
/home/nathan/Dev/click-tube/src/symfony/src/AppBundle/Comment/CommentManager.php:37:
array (size=1)
  'delay_between' => int 60

正如您所看到的,我无法修改app.commment.manager服务定义(这就是我想要做的)。但我可以反映扩展创建的服务的变化。 在app.comment.manager上应用更改的解决方案是什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

尝试在服务中注入扩展中定义的参数,例如:

app.comment.manager:
    class: AppBundle\Comment\CommentManager
    arguments:
        - "%app.comment.delay_between%"
        - "@doctrine.orm.entity_manager"

希望这个帮助

答案 1 :(得分:0)

我遇到了同样的问题,其中replaceArgument调用并没有真正修改给我服务的构造函数的参数。原因是我的services.yml已经在我的/app/config/config.yml中导入,如:

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
    - { resource: "@MyMightyBundle/Resources/config/services.yml" }

这将覆盖在met bundle扩展文件中加载的服务定义。删除config.yml中的service.yml导入解决了我的问题。