2012-01-09 29 views
2

有一個cookbook用於向樹枝模板引擎添加全局變量,但是它並沒有爲php引擎做同樣的事情。我將如何做到這一點?Symfony2:php模板引擎中的全局變量

所以我可能是這樣的:

# config.yml 
someSortOfReferenceToThePHPEngineInstance: 
    calls: 
     - [ addGlobals, ["foo", "bar"] ] 
     - [ addGlobals, ["myService", "@myService"] ] 

,然後訪問那些喜歡:

// templateName.contentType.php 
<? 
echo $foo; // echos "bar" 
echo $myService->myMethod($foo); // echos the result of modifying "bar" with "myMethod" method of "myService" service 
+0

你能寫一個你想如何做的代碼示例嗎? – greut 2012-01-09 17:19:21

回答

3

我找不到任何機制的文檔在這個PHP引擎...

然而,什麼工作是:

配置:

//config.yml  
parameters: 
     hello: "YO!" 

PHP模板:

// index.html.php 
<?php 

print $view->container->parameters['hello']; 

這不適合作爲很好的樹枝約定......也許有更好的方式 - 我還沒有調試任何進一步的...

+0

是的,那個容器對象也有可用的註冊服務。我們正在與舊系統集成,並希望能夠提供與現有代碼庫相同的界面。也爲什麼我們使用PHP而不是樹枝。 – tobymackenzie 2012-01-10 14:37:01

1

這裏有一對夫婦的選擇:

  1. 如果您創建一個基控制器,所有的人繼承,您可以覆蓋symfony中的渲染功能,並添加鍵參數參數,如:

    public function render($view, array $parameters = array(), Response $response = null){ 
        if(!array_key_exists("bar", $parameters){ 
         $parameters["foo"] = $this->get("foo"); 
        } 
        if(!array_key_exists("bar", $parameters){ 
         $parameters["bar"] = $this->get("bar"); 
        } 
        return parent::render($view, $parameters, $response); 
    } 
    

    這是我看到修改「全局」的「全局」變量的唯一途徑,但他們會不會在你所沒有創建控制器呈現的任何意見可(當然,那些可能會在Twig中完成,並且您可以使用添加功能的普通枝條方式)。

  2. PHP的渲染引擎已經幹嘛所謂的「幫手」,您可以通過$視圖的數組鍵訪問,如:

    $view["foo"]->doSomething(); 
    

    我們創建了一個類容易使服務納入助手:

    use Symfony\Component\Templating\Helper\Helper as BaseHelper; 
    
    class Helper extends BaseHelper{ 
        protected $name; 
        public $service; 
    
        public function __construct($name, $service){ 
         $this->name = $name; 
         $this->service = $service; 
        } 
        public function __get($name){ 
         if(isset($this->service->$name)){ 
          return $this->service->$name; 
         } 
        } 
        public function __call($name, $arguments){ 
         if(method_exists($this->service, $name)){ 
          return call_user_func_array(array($this->service,$name), $arguments); 
    
         } 
        } 
        public function getName(){ 
         return $this->name; 
        } 
    
    } 
    

    那麼在我們的服務下配置,我們要補充:

    helper.foo: 
        class: %helper.class% 
        arguments: 
         name: "foo" 
         helper: "@foo" 
        tags: 
         - { name: templating.helper, alias: foo } 
    

    理論上,這對任何視圖文件都是可用的,即使那些沒有控制權的控制器也是如此。

0

我有一個非常相同的問題。出於某種原因,此功能僅適用於TwigBundle的Twig模板。 Twig和PHP模板引擎都提供了定義全局變量的可能性,但只有Twig引擎具有配置。對我來說,實現這一點的唯一方法就是在問題中提出的方法 - 定義方法調用(這是Twig全局註冊的方式)。

問題是,使用DI分機無法從分機外部訪問服務定義,因此您無法從DI分機添加這些呼叫。我的方式是用DI編譯器通過。

但我也ChillDevViewHelpersBundle開發商,因爲我是在我的大多數項目面臨這樣的問題,我決定在那裏實現它的普遍使用,您可以使用0.1.8發佈此功能。

+0

很酷。我們現在對於使用助手(比如我的答案選項2)非常滿意,但我仍然希望能夠在配置中定義全局變量,也許在framework.templating.globals中。也許如果我有機會,我會盡力向核心提出請求 – tobymackenzie 2014-01-15 07:44:55