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, определенно есть setCurrentUri() метод для моего $menu,

4 ответа

Решение

Похоже, MenuItem::setCurrentUri() метод устарел с версии 1.1.0. См. https://github.com/KnpLabs/KnpMenu/issues/63 для получения дополнительной информации. Эта проблема имеет несколько ссылок о том, как установить текущий URI меню с помощью UrlVoter вместо.

Это не должно работать, если проблема связана с запросом. Вы можете попробовать это:

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

@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);

//...

Я нашел самое простое решение. просто добавь:

$menu->setCurrent(true);

Добавляет класс current в текущее меню. метод setCurrentUri был объявлен устаревшим и впоследствии удален из кнпмену.

Другие вопросы по тегам