0

KnpMenu チュートリアルを試してメニューを作成し、それを Symfony のブートストラップで使用します。ローカル モードでは完全に動作しますが、サーバー (両方とも開発モード) で試してみると、次のエラーが発生します。

「robStormWelcomeBundle:Homepage:index.html.twig」で、テンプレートのレンダリング中に例外がスローされました (「クラス "robStorm\WelcomeBundle\Menu\Builder" は、メニュー ビルダー "robStormWelcomeBundle:Builder" には存在しません。")。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>
4

1 に答える 1

1

問題は、ファイル/クラスの大文字と小文字にあります。

を使用するrobStormWelcomeBundle:Builder:mainMenuと、サーバーはファイルを検索しsrc/robStorm/WelcomeBundle/Menu/Builder.phpます (ファイル名が大文字になっていることに注意してください)。しかし、そのファイルは存在しません。名前を付けましたbuilder.php(小文字)。

あなたが今行った解決策(に変更...:Builder:mainMenu...:builder:mainMenuはそれほど良くありません。builderこれは、PHP が実際のクラスではなく、クラスを探すことを意味しますBuilderBuilderPHP は非常に怠惰な言語であるため、の代わりにクラスを受け入れますが、そうするのbuilderは良くありません。

非常に単純な場合の実際の解決策builder.php: 名前を に変更しBuilder.phpます。

これがローカル環境では発生せず、サーバーでは発生しない理由は、コンピューターも怠惰であるためです (サーバーはそうではありません)

于 2013-03-17T12:14:13.490 に答える