2013-12-10 101 views
3

我想爲所有視圖設置一些變量,這可能嗎?Symfony2設置默認視圖變量

我想我需要做一些引導方法。

但我想實現的是,當我從函數返回一個數組,以便它加載模板。使用Symfony2的默認設置。

然後我想附加一些我將通過Javascript訪問的變量。

比如我一直希望這是一個用戶對象,所以我希望它出現在佈局像

var user = {{user | json_encode()}} 

而且那麼這將是在javascript訪問。但是我不想在我創建的每個控制器中設置此變量,我想將其添加到所有控制器。我希望在這裏得到一些幫助。我已經找到了捆綁php文件,但我不知道這是否會幫助我。

+0

什麼是你需要的。可能有更好的方法來做到這一點。 – ILikeTacos

+0

我需要一些變量,我希望能夠通過javascript定義可訪問的變量。我的帖子在下面讓我有些接近,但並不完美,因爲我無法使用FrameworkExtraBundle。這允許我使用@Template()並返回array();但是這也必須可以覆蓋。 – Oldek

回答

1

如果您不想在控制器中初始化,您可以創建一個返回它的樹枝函數。

這種方式是叫 「延伸的樹枝」:http://twig.sensiolabs.org/doc/advanced.html

特殊的Symfony2:http://symfony.com/doc/current/cookbook/templating/twig_extension.html

它會做這樣的事情

var myJsvar = "{{ myfunction() }}"; 
+0

這是一個想法,我只是想爲捆綁中的所有控制器都有可能像引導功能一樣做。你知道這樣的事嗎?這注入了變量。 – Oldek

+2

我真的很抱歉,但我沒有聽說過引導程序的功能,直到你寫出來:/我需要檢查這個。我無法幫助你更多地瞭解這一點,你似乎比我擁有更多的知識...... – pbenard

+0

嗯,我真的不知道是否有這樣的功能。它可以通過依賴注入像一個服務到控制器,所以我可以在我的控制器函數中獲得$ defaults,它將是一個數組或其他東西。然後每次只是返回它。 – Oldek

0

我沒有得到的地方,

我設法設置這個抽象控制器,我把它放在我的默認控制器文件夾中

<?php 
namespace Namespace\DefaultBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\StreamedResponse; 

class AbstractController extends Controller 
{ 
    /** 
    * Returns a rendered view. 
    * 
    * @param string $view  The view name 
    * @param array $parameters An array of parameters to pass to the view 
    * 
    * @return string The rendered view 
    */ 
    public function renderView($view, array $parameters = array()) 
    { 
     $parameters = array_merge_recursive($parameters, $this->getDefaultSettings()); 

     return parent::renderView($view, $parameters); 
    } 

    /** 
    * Renders a view. 
    * 
    * @param string $view  The view name 
    * @param array $parameters An array of parameters to pass to the view 
    * @param Response $response A response instance 
    * 
    * @return Response A Response instance 
    */ 
    public function render($view, array $parameters = array(), Response $response = null) 
    { 
     $parameters = array_merge_recursive($parameters, $this->getDefaultSettings()); 

     return parent::render($view, $parameters, $response); 
    } 


    /** 
    * Streams a view. 
    * 
    * @param string   $view  The view name 
    * @param array   $parameters An array of parameters to pass to the view 
    * @param StreamedResponse $response A response instance 
    * 
    * @return StreamedResponse A StreamedResponse instance 
    */ 
    public function stream($view, array $parameters = array(), StreamedResponse $response = null) 
    { 
     $parameters = array_merge_recursive($parameters, $this->getDefaultSettings()); 

     return parent::stream($view, $parameters, $response); 
    } 

    public function getDefaultSettings() 
    { 
     $settings = array(); 

     if ($this->getUser()) { 
      # Just exports to an array 
      $settings['user'] = $this->getUser()->export(); 
     } 

     $settings['locales'] = array(
      array(
       'label' => 'English', 
       'code' => 'en-us' 
      ), 
      array(
       'label' => 'Swedish', 
       'code' => 'sv-se' 
      ) 
     ); 

     return array(
      "settings" => $settings 
     ); 
    } 
} 

然後我說這一個AbstractController到我的實際控制人:

<?php 

namespace Namespace\DefaultBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
class DefaultController extends AbstractController 
{ 
    /** 
    * @Route("/", name="home") 
    */ 
    public function indexAction() 
    { 

     return new Response($this->renderView("NamespaceDefaultBundle:Default:index.html.twig")); 
    } 
} 

然而,當我在我的docblock做@Template()這不起作用。因爲它不使用父類。所以它需要更多的工作,但它做到了我想要的。

然後在layout.html.twig我有以下幾點:

<script type="text/javascript"> 
    var settings = {{ settings | json_encode() | raw }}; 
</script> 
3

我想你可以用桂枝全局來獲得這一功能。 試着在你的命名空間\ DefaultBundle \ NamespaceDefaultBundle.php補充​​一點:

class MyBundle extends Bundle 
{ 
    public function boot() 
    { 
     $fooBar = 'foobar'; 
     $this->container->get('twig')->addGlobal('foo_bar', $fooBar); 
    } 
} 

這樣的VAR {{foo_bar這樣的名稱}}會在你所有的樹枝可用模板。