【问题标题】:Symfony2: global variables in php templating engineSymfony2:php模板引擎中的全局变量
【发布时间】:2012-01-09 16:29:06
【问题描述】:

有一个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

【问题讨论】:

  • 你能写一个代码示例来说明你想怎么做吗?

标签: templates symfony


【解决方案1】:

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

然而起作用的是:

配置:

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

PHP 模板:

// index.html.php
<?php

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

这不适合 twig 约定...也许有更好的方法 - 我没有进一步调试...

【讨论】:

  • 是的,该容器对象也有可用的注册服务。不过,我们正在与旧系统集成,并希望能够提供与现有代码库相同的界面。也是我们使用 php 而不是 twig 的原因。
【解决方案2】:

这里有几个选项:

  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 无论如何,你可以使用普通的 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 }
    

    理论上,这将适用于任何视图文件,即使是那些带有您无法控制的控制器的文件。

【讨论】:

    【解决方案3】:

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

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

    但我也是 ChillDevViewHelpersBundle 的开发人员,由于我在大多数项目中都面临这个问题,我决定在那里实现它以供普遍使用,您可以使用 0.1.8 版本这个功能。

    【讨论】:

    • 酷。目前,我们对使用帮助程序(例如在我的答案选项 2 中)感到非常满意,但我仍然喜欢能够在配置中定义全局变量的想法,可能在 framework.templating.globals 中。也许如果我有机会,我会尝试对核心的拉取请求
    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2017-09-06
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多