4

私は SonataAdminBundle と SonataUserBundle を使用しています。

SonataUserBundle は、SonataAdminBundle によって自動的に検出されるサービスsonata.user.admin.groupを登録して、管理ダッシュボードにリンクを設定し、CRUD 操作をグループ化します。

どうすれば無効にできsonata.user.admin.groupますか? 私は Symfony2 のドキュメントでそのレシピに従ってきました:

これまでのところ、コンパイラ パスを追加するためにバンドル定義に次のコードがあります。

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')、実際の定義は return です。

ありがとう

4

2 に答える 2

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);
于 2012-12-20T18:04:01.077 に答える
1

サービス定義を削除しましたが、ダッシュボードで引き続き使用されています。そのため、Symfony は文句を言います (ダッシュボードがアクセスしようとします)。オプションサービスではありません。

ダッシュボード テンプレートを上書きして、サービスの使用を避けることはできますか? この方法では、サービスは呼び出されず、削除する必要はありません。サービスが使用されていない場合、サービスは作成されません。

別の方法は、実装でサービスを過負荷にすることです。

于 2012-12-20T16:48:36.673 に答える