我试图拦截渲染功能或响应 在加载视图(twig)之前向其添加变量。
我试图覆盖默认的渲染方法但是它 仍然给了我
变量" myvar"在第10行的/path/to/baseAppLite.html.twig中不存在
我的代码有什么问题,还有更好的方法吗?
这是我在 baseController
中的覆盖代码public function render($view, array $parameters = array(), Response $response = null)
{
$parameters = array_merge(
$parameters,
array(
'myvar' => 'GlobalVar'
)
);
return parent::render($view, $parameters, $response);
}
用法
{{ myvar }}
更新: 从我可以看到的是渲染功能没有加载 因为我试着回应"渲染吧foo"并没有出现
答案 0 :(得分:3)
我认为渲染功能根本不需要被覆盖。 我可以想到几种方法可以访问某种全局变量,具体取决于全局变量的设置(或计算)方式。
Twig Globals
如果它是一个硬编码变量,那么你可以将它作为一个twig全局变量添加到你的config.yml中,就像这样......
# app/config/config.yml
twig:
# ...
globals:
ga_tracking: UA-xxxxx-x
然后可以像...一样使用
<p>The google tracking code is: {{ ga_tracking }}</p>
如此处所述 - http://symfony.com/doc/current/cookbook/templating/global_variables.html
树枝功能
或者,如果变量以某种方式与外部服务相关,则可以使用自定义树枝函数并在模板中调用它。
枝条延伸(带功能)..
class AcmeExtension extends \Twig_Extension
{
protected $container;
public function __construct(ContainerInterface $container = null)
{
$this->container = $container;
}
public function getFunctions()
{
return array(
new \Twig_SimpleFilter(
'get_parameter',
array($this, 'getParameter')
),
);
}
public function getParameter($parameter)
{
if (null === $this->container) {
return null;
}
return $this->container->getParameter($parameter);
// You could also do perform some kind of action
// rather than just return a value
}
public function getName()
{
return 'acme_extension';
}
}
注册为服务..
services:
acme.twig.acme_extension:
class: Acme\DemoBundle\Twig\AcmeExtension
arguments:
- @service_container
tags:
- { name: twig.extension }
然后在你的模板中你可以使用..
{{ get_parameter('myVar') }}
甚至......
{% set myVar = get_parameter('myVar') %}
答案 1 :(得分:1)
要添加到我的评论中,我已经创建了这个答案(抱歉语法错误/拼写错误)。
如果您想在需要始终存在的模板中传递var,您可以执行以下操作(无论如何我都是这样做的。)
我们假设我们有一个带有CRUD方法的PageController(更新,删除,显示等)。我们不是每次都传递那个var(或者通过修改已经定义的方法),而是可以执行以下操作:让Twig“获取”&#39; var通过呈现控制器动作。 Twig将调用相应的控制器并将呈现该变量。让我们假装它是一个页脚中的句子,需要在每个页面上按变量呈现(为了保持简单)。
我们可以在PageController中编写以下操作:
public function renderFooterAction() {
//Do your logic here, like retrieving the var from the database
//or something completely different.
//It could also be as easy as this:
$myVar = "This is a footer sentence";
//At the end we return a template
return $this->render('AcmeDemoBundle:Page:footer.html.twig', array(
'myVar' => $myVar,
));
}
footer.html.twig页面位于YourBundle \ Resources \ views \ Page \ footer.html.twig中。根据您的需要,它可能就像这样(您可以像常规树枝模板一样在这里做所有事情,我们保持简单并且只回显变量):
{{ myVar }}
在主模板中,您可以使用以下代码: {{render(&#39; AcmeDemoBundle:Page:renderFooter&#39;))}}
如果您需要在渲染其中一部分时,也可以在模板中传递参数,例如:
{{ render(controller('AcmeDemoBundle:Page:footer', { 'maxArticles': 5 })) }}
上面的假设是你想在控制器呈现的模板中进行for循环。
正如您所看到的,在模板中渲染控制器几乎就像渲染一个正常的&#39;查看,而不是返回整个模板,只需创建只有控制器负责输出的较小文件。
希望这个解释对你有所帮助:)当然,如果你仍然感到困惑,那就要求更清晰了。
编辑:也应该可以直接返回变量(我认为),但不能那么快记住。如果我能找到它会添加:)