繁体   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