2012-09-10 58 views
4

我已经看到有关此问题的其他错误。我做了完全一样的事情。当我试图使我得到这个致命错误菜单:KnpMenu,无法设置当前菜单项

Fatal error: Call to undefined method Knp\Menu\MenuItem::setCurrentUri() 
in ProjectBundle/Menu/Builder.php on line 23 

这是我的生成器的外观:

<?php 
use Knp\Menu\FactoryInterface; 
use Symfony\Component\DependencyInjection\ContainerAware; 
use Symfony\Component\HttpFoundation\Request; 

class Builder extends ContainerAware 
{ 

private $factory; 

public function __construct(FactoryInterface $factory) 
{ 
    $this->factory = $factory; 
} 

public function createMenu(Request $request) 
{ 

    $menu = $this->factory->createItem('root'); 
    $menu->setCurrentUri($request->getRequestUri()); 

    $menu->addChild('Home', array('route' => '_home')); 
    $menu->addChild('About', array('route' => '_about')); 
    $menu->addChild('Bullshit', array('route' => '_bullshit')); 

    return $menu; 
} 
} 

我通过Github上的问题跟踪去了,看来这个问题已经固定的,但为什么我又有同样的问题?

我的意思是,当我var_dump($menu),它清楚地说,这是一个MenuItem,看到KnpMenu的文件,肯定是我的一个$menu方法setCurrentUri()

+0

也许你正在使用和旧版本的捆绑?你正在运行Symfony 2.0或2.1吗?看看你的deps或composer.json文件,看看你是否要求一个特定的版本 –

+0

或者反过来:你使用的是最新版本的软件包,但是过时的文档? –

+0

该文档来自他们的Github页面。 – tolgap

回答

1

看起来MenuItem::setCurrentUri()方法从v1.1.0开始已弃用。有关更多信息,请参阅https://github.com/KnpLabs/KnpMenu/issues/63。这个问题有几个关于如何使用UrlVoter来设置当前菜单的URI的链接。

+0

你说得对,我一直无法自己发现。我阅读了几个有关'setCurrentUri()'应该工作的答案。我做了一个RequestVoter并实现了VoterInterface。它现在有效。请参阅[Github上的此修复](https://github.com/KnpLabs/KnpMenuBundle/issues/122#issuecomment-6563863) – tolgap

3

如果问题是由于请求 引起的,它应该不起作用。您可以尝试:

public function **CreateMenu**(\Knp\Menu\FactoryInterface $factory, array $options) 
{ $menu = $factory->createItem('root'); 

    $menu->setCurrentUri($this->container->get('request')->getRequestUri()); 
$menu->addChild('Home', array('route' => '_home')); 
$menu->addChild('About', array('route' => '_about')); 
.. 

return $menu;} 
2

@ aurny2420289给出了一个简单的解决方案。

但现在它的建议使用UriVoter

use Knp\Menu\Matcher\Voter\UriVoter; 
use Knp\Menu\Renderer\ListRenderer; 

//... 

$matcher = new Matcher(); 
$matcher->addVoter(new UriVoter($_SERVER['REQUEST_URI'])); 

$renderer = new ListRenderer($matcher); 

//... 
+0

API对开发人员友好很多 – younes0

+0

我应该在哪里放这段代码? – jekaby

0

我发现最简单的解决方案。 只需添加:

$menu->setCurrent(true); 

它增加了类 '当前' 到当前菜单。方法setCurrentUri已被弃用,随后从knpmenu中删除。