2013-03-27 3 views
0

관리 메뉴 번들을 만들고 있습니다. 다른 번들이 번들에 메뉴 항목을 추가 할 수있게하고 싶지만 번들을 제거 할 때 메뉴 항목을 삭제하기를 원합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?Symfony2에서 번들을 통신하는 방법

특정 YML에 대한 모든 번들을 스캔 한 다음 캐시 또는 데이터베이스에 저장하는 '관리 메뉴 다시 생성'작업을 만들 수 있습니다.

더 좋은 방법이 있나요?

답변

3

을 사용하면 다른 번들의 서비스 (또는 동일하게)를 찾아서 compiler pass에있는 메뉴를 빌드하는 데 사용할 수 있습니다.

이 예에서는 메뉴를 서비스로 정의했다고 가정합니다 (서비스 ID는 acme_menu.menu입니다).

// 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를가 태그 서비스와 창조의의 메뉴에서 호출됩니다

// 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)) 
      ); 
     } 
    } 
} 

하면 메뉴 번들로 등록 매개 변수로. 간단히 정의하면 다음과 같습니다.

# services.yml 
services: 
    acme_demo.menu.item1: 
     # ... 
     tags: 
      - { name: acme_menu.item } 
    acme_demo.menu.item2: 
     # ... 
     tags: 
      - { name: acme_menu.item } 
관련 문제