Исключение Symfony Конструктор KNPMenu не существует для конструктора меню
Я пробую учебник KnpMenu, чтобы создать меню, и использую его с начальной загрузкой в Symfony. Он отлично работает в локальном режиме, но когда я пробую его на моем сервере (оба в режиме разработки), он не работает, у меня есть эта ошибка:
Во время рендеринга шаблона возникло исключение ("Class "robStorm\WelcomeBundle\Menu\Builder"не существует для построителя меню"robStormWelcomeBundle:Builder".") В "robStormWelcomeBundle:Homepage:index.html.twig". 500 Внутренняя ошибка сервера - связанное исключение Twig_Error_Runtime 1: InvalidArgumentException "
Тем не менее, у меня есть точно такие же файлы в локальной или на сервере...
Вот содержимое моего файла:
В app / 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>
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
,
Причина, по которой этого не происходит в вашей локальной среде, но не на сервере, заключается в том, что компьютер слишком ленив (а сервер нет).