2011-10-27 45 views
5

我發現了幾個在Symfony2中處理cookie的問題和頁面,但似乎沒有任何明確的共識來說明這應該如何工作。當然,我可以回到使用PHP的本地功能setcookie,但我覺得這對Symfony2也應該是一件容易的事情。將Cookie附加到Symfony2中的視圖

我在我的控制器中有一個動作,我只是想用附加的cookie返回一個視圖。到目前爲止,我看起來基本上是這樣的例子:

use Symfony\Compentnt\HttpFoundation\Response; 

public function indexAction() { 
    $response = new Response(); 
    $response->headers->setCookie(new Cookie('name', 'value', 0, '/'); 
    $response->send(); 
} 

這個問題是,它發送響應...並且不呈現視圖。如果我在不發送標題的情況下設置cookie,則會呈現視圖,但不會發送標頭(cookie)。

閒逛我發現sendHeaders()方法Response對象,所以我現在手動調用,在我回國的行動之前,似乎工作:

public function indexAction() { 
    ... 
    $response->sendHeaders(); 
    return array('variables' => 'values'); 
} 

但這真的預期的模式使用?在以前的symfony版本中,我可以在控制器中設置標題,並期望視圖控制器處理髮送的任何內容。現在看來,我必須手動將它們從動作中發送出去才能使其正常工作,這意味着我必須從任何設置標題的動作中調用該動作。是這種情況還是存在某些我錯過的東西,這很明顯在任何文檔中甚至沒有人提及它?

回答

18

我認爲你是在正確的線路搭配:

$response->headers->setCookie(new Cookie('name', 'value', 0, '/')); 

如果你想呈現一個模板,然後檢查了這裏的文檔:

Symfony2 Templating Service

如果你看看在線:

return $this->render('AcmeArticleBundle:Article:index.html.twig'); 

基本上render方法正在返回一個re其中有樹枝模板的內容sponse(該控制器然後返回),所有你需要做的就是攔截這樣的:

$response = $this->render('AcmeArticleBundle:Article:index.html.twig'); 
$response->headers->setCookie(new Cookie('name', 'value', 0, '/')); 
return $response; 

我想反正就是這樣......

+0

仍在試圖讓我的軸承與Symfony2。我用Zend框架使用類似的代碼,明確地從控制器中調用模板。我想我只是困惑,爲什麼在默認情況下視圖被稱爲,但如果我嘗試修改響應它不是。謝謝! –

+1

您是否在Action上使用註釋'Template'?如果是這樣,則該註釋的空白版本將呈現與該動作具有相同名稱的模板。如果您手動返回另一個響應,我認爲它可能會覆蓋'Template'註釋,在這種情況下,您將無法看到視圖內容。我不確定這是否完全正確,但想象一下像if(!($ controllerReturn instaceof Response)){// render template} else {return $ controllerReturn; }'。 – Kasheen

+0

爲了跟上我的最後一個解釋,你可以查看'Sensio \ Bundle \ FrameworkExtraBundle \ EventListener \ TemplateListener',特別是'onKernelView'方法,你可以看到它是如何控制器的返回('$ parameters')並使用它們來生成一個模板或直接返回它們。儘管這些東西有點過分,但我只是把它發佈,因爲你似乎想要一個解釋,有時候這些就像是一個惱人的癢;)。 – Kasheen

相關問題