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

Posted

技术标签:

【中文标题】禁用 SonataUserBundle sonata.user.admin.group 服务【英文标题】:Disable SonataUserBundle sonata.user.admin.group service 【发布时间】:2012-12-08 05:46:18 【问题描述】:

我正在使用 SonataAdminBundle 和 SonataUserBundle。

SonataUserBundle 注册了一个服务 sonata.user.admin.group,它会被 SonataAdminBundle 自动检测到,以在管理仪表板中设置链接以对 CRUD 操作进行分组。

如何禁用sonata.user.admin.group?我一直在关注 Symfony2 文档中的那些食谱:

How to Override any Part of a Bundle - Services and Configuration

Compiling the Container - Creating a Compiler Pass

Working with Container Parameters and Definitions

到目前为止,我的包定义中有以下代码来添加编译器通道:

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-&gt;getDefinition('sonata.user.admin.group') 实际定义是返回。

谢谢

【问题讨论】:

【参考方案1】:

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

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

完整性补充:

并添加到 CompilerPass:

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

【讨论】:

行得通!但是将以下内容添加到CompilerPass:$container->getDefinition('sonata.user.admin.group')->setSynthetic(true); 谢谢,一直在找这个! 实施解决方案的两个建议部分会引发错误“综合服务(“sonata.user.admin.group”)必须是公共的。”在cache:clear。但是,仅第一部分本身对我来说就很好:添加 CompilerPass 部分有什么不同?【参考方案2】:

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

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

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

【讨论】:

好的,当然,这是有道理的。但我认为仪表板模板与它无关:goo.gl/vc4rk 我在 SonataUserBundle 视图中也看不到任何关系:goo.gl/oSjdY 知道它在哪里管理吗? 比很多@JakubZalas,你的回答直指正确的问题

以上是关于禁用 SonataUserBundle sonata.user.admin.group 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 SonataUserBundle 模板

SonataUserBundle 的 check_path 异常

获取用户列表时发生 SonataUserBundle 错误

SonataUserBundle 覆盖 EditableRolesBuilder

SonataUserBundle 和 Symfony 3.4

在 Symfony/SonataUserBundle 设置中调用方法 setCurrentUri 失败