<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1,安装knp-menu-bundle </span>
php composer.phar require "knplabs/knp-menu-bundle: ~2.0" #composer的安装可以百度
</pre>2,更改app/AppKernel.php<pre name="code" class="html"><?php public function registerBundles() { $bundles = array( // ... new Knp\Bundle\MenuBundle\KnpMenuBundle(), ); // ... }3,配置 (app/config/config.yml)
knp_menu: twig: # use "twig: false" to disable the Twig extension and the TwigRenderer template: knp_menu.html.twig #指定渲染模板; templating: false # if true, enables the helper for PHP templates default_renderer: twig # The renderer to use, list is also available by default
4,使用
在某一bundle下创建Menu文件夹,在Menu文件夹下创建Builder.php文件
<?php // src/Acme/DemoBundle/Menu/Builder.php namespace Acme\DemoBundle\Menu; use Knp\Menu\FactoryInterface; use Symfony\Component\DependencyInjection\ContainerAware; class Builder extends ContainerAware { public function mainMenu(FactoryInterface $factory, array $options) { $menu = $factory->createItem('root'); $menu->addChild('Home', array('route' => 'homepage')); #route 对应路由名称,如果不存在会报错 $menu->addChild('About Me', array( 'route' => 'page_show', 'routeParameters' => array('id' => 42) )); // ... add more children return $menu; } //如果有需要再创建一个Menu可以再加一个方法 public function sidebarMenu(FactoryInterface $factory, array $options) { } }
在任何模板中就可以使用如下方法
{{ knp_menu_render('AcmeDemoBundle:Builder:mainMenu') }}
5.扩展
创建一个服务knp_menu;
<?php // src/Acme/MainBundle/Menu/MenuBuilder.php namespace Acme\MainBundle\Menu; use Knp\Menu\FactoryInterface; use Symfony\Component\HttpFoundation\Request; class MenuBuilder { private $factory; /** * @param FactoryInterface $factory */ public function __construct(FactoryInterface $factory) { $this->factory = $factory; } public function createMainMenu(Request $request) { $menu = $this->factory->createItem('root'); $menu->addChild('Home', array('route' => 'homepage')); // ... add more children return $menu; } }
配置服务
# src/Acme/MainBundle/Resources/config/services.yml services: acme_main.menu_builder: class: Acme\MainBundle\Menu\MenuBuilder arguments: ["@knp_menu.factory"] acme_main.menu.main: class: Knp\Menu\MenuItem # the service definition requires setting the class factory_service: acme_main.menu_builder factory_method: createMainMenu arguments: ["@request"] scope: request # needed as we have the request as a dependency here tags: - { name: knp_menu.menu, alias: main } # The alias is what is used to retrieve the menu
添加子项
public function mainMenu(FactoryInterface $factory, array $options) { $menu = $factory->createItem('root'); $menu->addChild('Home', array('route' => 'acme_demo_default')); $menu->addChild('About Me', array( 'route' => 'acme_demo_form', 'routeParameters' => array('id' => 42) )); $menu['About Me']->addChild('wawa'); // ... add more children return $menu; }
只渲染子类
{% set menuItem = knp_menu_get('AcmeDemoBundle:Builder:mainMenu', ['About Me']) %} {{ knp_menu_render(menuItem) }}
参考文档: 点击打开链接