このようにしました。 KnpMenuをサービスとして登録し、そのクラスにentityManagerを渡しました。手にEMで
stex_site_main.menu_builder:
class: Stex\SiteBundle\Menu\MenuBuilder
arguments: ["@knp_menu.factory", "@doctrine.orm.entity_manager"]
stex_site_main.menu.main:
class: Knp\Menu\MenuItem
factory_service: stex_site_main.menu_builder
factory_method: createMainMenu
arguments: ["@request"]
scope: request
tags:
- { name: knp_menu.menu, alias: main }
私は、エンティティMYMENUを開き、DBに書かれたメニュー項目を生成します。
(などとサブサブサブ)メニュー項目へ
private $factory;
private $em;
public function __construct(FactoryInterface $factory, \Doctrine\ORM\EntityManager $em)
{
$this->factory = $factory;
$this->em = $em;
}
public function createMainMenu(\Symfony\Component\HttpFoundation\Request $request)
{
$menu = $this->factory->createItem('root');
$menu->setChildrenAttribute('class', 'menu');
$menu->addChild(' ', array('route' => 'stex_site_home_home', 'attributes' => array('class' => 'home')));
$menu->setCurrentUri($request->getRequestUri());
$em = $this->em;
$q = $em->createQuery('
SELECT m
FROM StexAdminBundle:MyMenu m
WHERE m.status=1
ORDER BY menu.position');
$r = $q->getResult();
foreach($r as $menu) {
$menu->addChild($menu->getName(), array('route' => $menu->getRoute(), 'routeParameters' => array(json_decode($menu->getParams())));
}
return $menu;
}
マッピングコントローラは(私による)現実世界のアプリでは非常にまれなケースであり、非常に使用できなくなります(あなたは主に「例外」をコーディングする必要があります考えどのコントローラーが含まれていないかなど)。
私はDBメニューを用意しています。 非常に柔軟性があり、ユーザーは素敵なインターフェイスなどで編集できます。
あなたの主な質問で本当に助けになることはできませんが、すべての設定が終了してかなり効率的なPHPコードになってしまいます。キャッシュされているファイルをチェックして結果を確認します。だから、ほとんどのものが重すぎることを心配しないでください。 – Cerad
はい、私は移動するために私自身のサービスを書くことに決めました。私はキャッシュを使用すると、実際にはスピードアップします:) –
そのコードを見ることは可能ですか?私は、現在のルートパラメータに応じて生成されたメニューを解決するために、同じ問題にヒットしました。 – nysander