禁用SonataUserBundle sonata.user.admin.group服务

时间:2012-12-20 16:42:20

标签: php symfony dependency-injection fosuserbundle sonata-admin

我正在使用SonataAdminBundle和SonataUserBundle。

SonataUserBundle注册了一个服务sonata.user.admin.group,SonataAdminBundle会自动检测该服务,以便在管理信息中心设置链接以对CRUD操作进行分组。

如何停用sonata.user.admin.group?我一直在Symfony2文档中遵循这些配方:

到目前为止,我在bundle定义中有以下代码来添加编译器传递:

public function build(ContainerBuilder $container)
{
  parent::build($container);

  $container->addCompilerPass(new CompilerPass());
}

这是编译器传递:

<?php

namespace NS\Service\CompilerPass;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
       $container->removeDefinition('sonata.user.admin.group');
    }
}

我认为这应该有效但不行。 Symfony正在抛出异常,告诉我sonata.user.admin.group服务不存在。但它存在,如果我$container->getDefinition('sonata.user.admin.group'),实际的定义就是返回。

由于

2 个答案:

答案 0 :(得分:9)

尝试将服务标记为抽象,并将其public属性设置为false,例如

#in any services.yml
services:
    sonata.user.admin.group:
      abstract: true
      public: false
    #...

除了完整性:

并添加到CompilerPass:

$container->getDefinition('sonata.user.admin.group')->setSynthetic(true);

答案 1 :(得分:1)

您已删除服务定义,但仍在仪表板上使用。这就是Symfony抱怨的原因(仪表板试图访问它)。它不是可选服务。

您可以尝试覆盖仪表板模板并避免使用该服务吗?这样就不会调用服务,也不必删除它。如果不使用服务,则永远不会创建。

替代方案是使用您的实现重载服务。