我正在使用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')
,实际的定义就是返回。
由于
答案 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抱怨的原因(仪表板试图访问它)。它不是可选服务。
您可以尝试覆盖仪表板模板并避免使用该服务吗?这样就不会调用服务,也不必删除它。如果不使用服务,则永远不会创建。
替代方案是使用您的实现重载服务。