2016-09-14 115 views
0

我發誓我已經使用了這個並試圖理解文檔,但我只是沒有得到它。我正在寫一個樹枝函數,我不明白的是我如何訪問從函數內部傳遞給render的變量。php twig獲取變量傳遞給擴展函數中的渲染

所以,如果我有這個註冊我的分機和調用render:

$o = new SomeObject(); 
$twig->addExtension(new MyExtension()); 
$twig->render('example.html',array('obj'=>$o)) 

而且example.html的只是{{ myfunc('foo') }} 我如何訪問變量MyExtension 'OBJ' 從內MYFUNC:

class MyExtension extends \Twig_Extension 
{ 
    public function getName() 
    { 
    return 'myextension'; 
    } 
    public function getFunctions() 
    { 
    return array(
     new \Twig_SimpleFunction('myfunc', 'MyExtension::myfunc', array('needs_environment' => true)) 
    ); 
    } 
    public static function myfunc(\Twig_Environment $env, $name) 
    { 
    //how to I get 'obj' from $twig->render in here? 
    } 
} 
+0

你確定你確實需要這樣做嗎?調用函數時需要傳遞的變量更爲常見。 – Cerad

回答

3

要在函數聲明中使用'needs_context' => true

new \Twig_SimpleFunction('myfunc', [$this, 'myfunc'], [ 
    'needs_environment' => true, 
    'needs_context' => true, 
]) 

然後,您將獲得第一個(或第二個,如果needs_environment也是如此)參數,該數組包含當前上下文的數據。這將保存你的變量。

public function myfunc(\Twig_Environment $env, $context, $name) 
{ 
    var_dump($context); 
} 
+0

謝謝Yoshi,它做到了。樹枝文檔中的示例不使用名稱空間,但是我是這樣的,並且在樹枝嘗試將eval()傳遞給getFunctions()的名稱時,我不會收到任何函數錯誤,這就是爲什麼它是類中的靜態方法。如果有更好的辦法,我願意接受。 –

+1

@RobertLabrie我已經改變了我的答案,以顯示如何使用非靜態方法。希望能幫助到你! :) – Yoshi