2012-09-10 61 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中刪除。