0

管理メニューバンドルを作成しています。他のバンドルがバンドルにメニュー項目を追加できるようにしたいが、バンドルが削除されたときにメニュー項目も削除したい. これを行う最良の方法は何ですか?

特定の YML のすべてのバンドルをスキャンし、それをキャッシュまたはデータベースに保存する「管理メニューの再生成」アクションを作成できます。

これを行うより良い方法はありますか?

4

1 に答える 1

3

タグを使用して他のバンドル (または同じもの) からサービスを検索し、それらを使用してコンパイラ パスでそれらからメニューを構築できます。

この例では、メニューがサービスとして定義されていると仮定します (サービス id を使用しますacme_menu.menu)。

// src/Acme/MenuBundle/DependencyInjection/Compiler/BuildMenuCompilerPass.php
namespace Acme\MenuBundle\DependencyInjection\Compiler;

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

class BuildMenuCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition('acme_menu.menu')) {
            return;
        }

        $definition = $container->getDefinition('acme_menu.menu');

        $taggedServices = $container->findTaggedServiceIds('acme_menu.item');
        foreach ($taggedServices as $id => $attributes) {
            $definition->addMethodCall(
                'addMenuItem',
                array(new Reference($id))
            );
        }
    }
}

メニュー バンドルに登録します。

// src/Acme/MenuBundle/AcmeMenuBundle.php
namespace Acme\MenuBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;

use Acme\MenuBundle\DependencyInjection\Compiler\BuildMenuCompilerPass;

class AcmeMenuBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

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

そして、 としてタグ付けされたすべてのサービスがacme_menu.itemメニューに追加されます。これらのメソッドaddMenuItemは、タグ付けされたサービスをパラメーターとして使用して、作成時にメニューで呼び出されます。したがって、次のように簡単に定義します。

# services.yml
services:
    acme_demo.menu.item1:
        # ...
        tags:
            - { name: acme_menu.item }
    acme_demo.menu.item2:
        # ...
        tags:
            - { name: acme_menu.item }
于 2013-03-27T11:15:00.237 に答える