簡體   English   中英

Symfony2:PHP模板引擎中的全局變量

[英]Symfony2: global variables in php templating engine

有一個食譜可以將全局變量添加到樹枝模板引擎中,但是對於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

我找不到有關PHP引擎的任何文獻資料...

但是,有效的是:

配置:

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

PHP模板:

// index.html.php
<?php

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

這不像樹枝約定那么完美...也許有更好的方法-我沒有進一步調試...

這里有幾個選擇:

  1. 如果創建一個其他所有繼承的基本控制器,則可以覆蓋symfony的render函數並將鍵添加到parameter參數,例如:

     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的數組鍵來訪問它,例如:

     $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 } 

    從理論上講,這將對所有視圖文件可用,即使是那些您無法控制的控制器也是如此。

我有一個非常相同的問題。 由於某些原因,此功能僅適用於使用TwigBundle進行Twig模板化。 Twig和PHP模板引擎都提供了定義全局變量的可能性,但是只有Twig引擎對此進行了配置。 對我而言,唯一真正的實現方法是您在問題帖中提出的內容-定義方法調用(這是Twig全局變量注冊的方式)。

問題是,使用DI擴展不能從擴展外部訪問服務定義,因此不能從DI擴展添加這些呼叫。 對我而言,方法是使用DI編譯器傳遞。

但是我還是ChillDevViewHelpersBundle的開發人員,由於我在大多數項目中都遇到了這個問題,因此我決定在那里實現該功能以實現普遍使用,並且您可以使用此功能的0.1.8版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM