Исключение Symfony Построитель KNPMenu не существует для построителя меню

Я пытаюсь создать меню с помощью учебника KnpMenu и использовать его с начальной загрузкой в ​​Symfony. Он отлично работает в локальном режиме, но когда я пробую его на своем сервере (оба в режиме разработки), он не работает, у меня есть эта ошибка:

Во время рендеринга шаблона возникло исключение ("Класс "robStorm\WelcomeBundle\Menu\Builder" не существует для построителя меню "robStormWelcomeBundle:Builder".") в "robStormWelcomeBundle:Homepage:index.html.twig". 500 Internal Server Error — Twig_Error_Runtime 1 связанное исключение: InvalidArgumentException »

Однако у меня есть точно такие же файлы локально или на сервере...

Вот содержимое моего файла:

В приложении/config/config.yml:

# Twig Configuration
twig:
    debug:            %kernel.debug%
    strict_variables: %kernel.debug%
twig:
    form:
        resources:
            - "BraincraftedBootstrapBundle:Form:form_div_layout.html.twig"
knp_menu:
   twig:
       template: "BraincraftedBootstrapBundle:Menu:menu.html.twig"

В src/robStorm/WelcomeBundle/Controller/HomepageController:

public function indexAction()
{
    return $this->render('robStormWelcomeBundle:Homepage:index.html.twig');
}

В src/robStorm/WelcomeBundle/Menu/builder.php:

<?php
namespace robStorm\WelcomeBundle\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAware;
use Knp\Menu\Matcher\Matcher;
use Knp\Menu\Matcher\Voter\UriVoter;
use Knp\Menu\MenuFactory;
use Knp\Menu\Renderer\ListRenderer;

class Builder extends ContainerAware
{

    public function mainMenu(FactoryInterface $factory, array $options)
    {
        $menu = $factory->createItem('root');

        $item = $menu->addChild('Accueil', array('route' => 'robStormWelcomeBundle_homepage'));      
        $menu->addChild('Combat', array('route' => 'robStormWelcomeBundle_homepage_combat'));
        $menu->addChild('Boutique', array('uri' => '#'));


        return $menu;
    }

    public function menuDroite(FactoryInterface $factory, array $options)
    {
        $menu = $factory->createItem('root');

        $menu->addChild('Aide', array('uri' => '#'));
        $menu->addChild('d1', array('attributes' => array('divider' => true)));
        $dropdown = $menu->addChild('Mon compte');
        $dropdown->addChild('Mon profil', array('uri' => '#'));
        $dropdown->addChild('Mes messages', array('uri' => '#'));
        $dropdown->addChild('d1', array('attributes' => array('divider' => true)));
        $dropdown->addChild('Se déconnecter', array('uri' => '#'));

        return $menu;
    }


}

В src/robStorm/WelcomeBundle/Ressources/config/routing.yml:

robStormWelcomeBundle_homepage:
    pattern:  /
    defaults: { _controller: "robStormWelcomeBundle:Homepage:index" }

В src/robStorm/WelcomeBundle/Ressources/views/layout.html.twig:

<div class="container">
    {{ knp_menu_render('robStormWelcomeBundle:Builder:mainMenu', {'nav_type': 'navbar', 'currentAsLink': true}) }}
    {{ knp_menu_render('robStormWelcomeBundle:Builder:menuDroite', {'nav_type': 'navbar', 'currentAsLink': true, 'pull': 'right'}) }}
</div>

person user2178964    schedule 17.03.2013    source источник
comment
Просто поставить билдер вместо Builder работает, но почему??: {{knp_menu_render('robStormWelcomeBundle:builder:mainMenu', {'nav_type': 'navbar', 'currentAsLink': true}) }}   -  person user2178964    schedule 17.03.2013


Ответы (1)


Проблема связана с файлом/классом.

Если вы используете robStormWelcomeBundle:Builder:mainMenu, сервер будет искать файл src/robStorm/WelcomeBundle/Menu/Builder.php (обратите внимание на имя файла с заглавной буквы). Но этого файла не существует, вы назвали его builder.php (нижний регистр).

Решение, которое вы сделали сейчас (изменение ...:Builder:mainMenu на ...:builder:mainMenu), не очень хорошее. Это означает, что PHP будет искать класс builder вместо фактического класса Builder. Поскольку PHP — очень ленивый язык, он примет класс Builder вместо builder, но это нехорошо.

Фактическое решение, если оно очень простое: переименуйте builder.php в Builder.php.

Причина, почему этого не происходит в вашей локальной среде, но не на сервере, заключается в том, что компьютер тоже ленив (а сервер - нет).

person Wouter J    schedule 17.03.2013