Symfony2:php模板引擎中的全局变量

时间:2012-01-09 16:29:07

标签: templates symfony

有一个cookbook用于向twig模板引擎添加全局变量,但是它不会为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

3 个答案:

答案 0 :(得分:3)

我找不到关于PHP引擎的任何文档...

但是有什么用呢:

配置:

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

PHP模板:

// index.html.php
<?php

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

这不像枝条常规那样合适......也许有更好的方法 - 我还没有进一步调试......

答案 1 :(得分: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);
    }
    

    这是我看到修改“全局”变量“全局”的唯一方法,虽然它们不会在你没有创建的控制器渲染的任何视图中可用(当然,那些可能会在无论如何,你可以使用正常的枝条添加功能)。

  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 }
    

    理论上,这对于任何视图文件都是可用的,即使是那些没有控制权的控制器。

答案 2 :(得分:0)

我遇到了同样的问题。出于某种原因,此功能仅适用于TwigBundle的Twig模板。 Twig和PHP模板引擎都提供了定义全局变量的可能性,但只有Twig引擎才能配置它。对我来说,实现这一目标的唯一真正方法是你在问题帖子中提出的 - 定义方法调用(这是Twig全局注册的方式)。

问题是,对于DI扩展,您无法从扩展程序外部访问服务定义,因此您无法从DI扩展程序添加这些调用。我的方法是用DI编译器传递。

但我也是ChillDevViewHelpersBundle的开发人员,因为我在大多数项目中都遇到了这个问题,所以我决定在那里实现它以供常用,你可以使用 0.1.8 发布此功能。