2013-03-17 56 views
0

我嘗試使用KnpMenu教程來創建菜單,並在Symfony中使用它進行引導。 它完全以本地模式,但是當我嘗試一下我的服務器(無論是在開發模式),它不工作,我有這樣的錯誤:Symfony異常KNPMenu構建器不存在菜單生成器

一個例外模板的渲染過程中被拋出 ( 「類 」robStorm \ WelcomeBundle \菜單\生成器robStormWelcomeBundle「 沒有菜單 建設者存在 」:「。」 生成器)在 「robStormWelcomeBundle:首頁:index.html.twig」。 500內部服務器錯誤 - Twig_Error_Runtime 1鏈接的異常: InvalidArgumentException»

不過,我正好在本地或服務器上的相同文件...

這裏是我的文件的內容:

在應用程序/配置/ 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 /控制器/ HomepageController:

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

在SRC/robStorm/WelcomeBundle /菜單/ 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 /配置/ 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> 
+0

簡單地說 「建設者」 就地 「生成器」 的作品,但爲什麼??:{{knp_menu_render( 'robStormWelcomeBundle:製造商:MAINMENU',{ 'nav_type': '導航欄', 'currentAsLink':真正} )}} – user2178964 2013-03-17 10:48:05

回答

1

問題是與文件/類的情況。

如果使用robStormWelcomeBundle:Builder:mainMenu,服務器將查找src/robStorm/WelcomeBundle/Menu/Builder.php文件(注意capitialized文件名)。但該文件不存在,您將其命名爲builder.php(小寫)。

您現在所做的解決方案(更改...:Builder:mainMenu...:builder:mainMenu)並不好。這意味着PHP將尋找builder類,而不是實際的Builder類。因爲PHP是一種非常懶惰的語言,它將接受Builder類而不是builder,但這樣做不好。

實際的解決方案如果很簡單:將builder.php重命名爲Builder.php

原因爲什麼不在本地環境發生的,而不是在服務器上,是因爲計算機是懶惰太(服務器不可)。