我在基本控制器中有这样的代码:
$this->eu_cookie_preference = $this->input->cookie('eu-cookie-preference');
并且在我的每个控制器函数中,我将此变量传递给这样的树枝:
$this->twig->display('account/my_details.twig', array(
'title' => 'Website | My Details',
'lang' => $this->lang,
'eu_cookie_preference' => $this->eu_cookie_preference,
));
在Base Twig中我使用这个变量来做各种事情。 有没有办法从Twig访问$ this-> eu_cookie_preference变量而不必在每个控制器函数中明确地将它传递给每个Twig?
我遇到类似会话变量的问题,因为我必须将它们传递给每个树枝才能访问它们。
答案 0 :(得分:2)
您可以使用Twigs addGlobal
函数来执行此操作。 See manual
// Add static text
$twig->addGlobal('text', 'Hello World');
// Add array
$twig->addGlobal('arr', array(1, 2, 3));
// Add objects
$twig->addGlobal('obj', $obj);
你可以像普通的vars一样使用这些全局变量:
This is a Text: "{{ text }}",
item in an array {{ arr[0] }},
obj value {{ obj.publicAttr }} or
obj function {{ obj.toHTML5('<img src="" />') }}
这样你也可以实现延迟加载。如果从数据库加载会话数据,那么在每个模板中都不会使用它来构建这样的类:
class OnDemand {
private $cache;
private $function;
function __construct($function) {
$this->function = $function;
}
private function cache() {
if($this->cache == null) {
$function = $this->function;
$this->cache = $function();
}
}
function __toString() {
$this->cache();
return (string) $this->cache;
}
function __get($key) {
$this->cache();
return $this->cache[$key];
}
function __isset($key) {
$this->cache();
return isset($this->cache[$key]);
}
}
并传递如下值:
$twig->addGlobal('aDataArray', new OnDemand(function(){
// load database data
$data = DB::loadData(...);
return $data;
}));
只有在树枝中调用变量时才会调用该函数。
{{ aDataArray.user.name }}