[英]Give a null response from controller and stop page load - Symfony2
我正在使用Symfony2,並且需要執行一些代碼。 它執行一些數據庫備份類型的工作。 這對於這個問題並不重要。
我想要的是,當我按下一個按鈕時,它將執行代碼並返回主視圖。 不要加載/重新加載任何頁面。 但是控制器始終期望得到響應。
控制器必須返回響應(給定null)。 您是否忘記在控制器的某處添加return語句?
所以我試圖用null
偽造它
按鈕代碼如
<li id="menu"><a href="{{ path('backup_label') }}"><span class="icon-align-justify"></span> Backup</a></li>
和我嘗試過的響應代碼
return $this->render(
null,
array('status' => 'ok')
);
要么
return $this->render(
'',
array('status' => 'ok')
);
要么
return new Response('<html><body></body></html>')
要么
return new Response()
這些是返回錯誤或空白頁。
在沒有得到新響應的情況下執行一些php代碼的方法是什么? 調用一個函數,執行並保持相同的視圖而無需任何加載,簡單。
我可以使用ajax做到這一點。 但是我希望如果沒有ajax也可以。
不過,下載zip文件是HTTP響應。 您可以在Symfony HTTP基礎上完成您想做的事情,並且也永遠不要回避這種標准流程,因為它可能會破壞事情。 對於初學者,退出控制器將阻止kernel.terminate
和其他事件觸發,因此將不會調用監聽器,這可能會破壞您不知道的東西。
而是使用響應對象:
$response = new Response();
$response->headers->set('Content-Description', 'File Transfer');
$response->headers->set('Content-Type', 'application/octet-stream');
$response->headers->set('Content-Disposition', 'attachment; filename=' . basename($zipfname));
$response->setContent(file_get_contents($zipfname));
return $response;
如果您的zip文件很大,則StreamedResponse類可能是更好的選擇,因為這種方式不會將文件內容加載到內存中:
$response = new StreamedResponse(function() use ($zipfname) {
readfile($zipfname);
});
// set headers
return $response;
HTTP沒有適當的“當前”視圖概念,因為它是無狀態的。 這是一個請求/響應協議,因此必須以某種響應來響應Web服務器用戶請求的任何操作。
就是說, 似乎停留在同一頁面上是完全有效的。 您可以使用ajax或通過發送與用戶按下按鈕之前相同的內容/響應來進行響應。 您可以使用HTTP_REFERER
,但這並不是100%可靠的,因此您可能要使用另一種方法 。 另外,如果您確定要重定向用戶到哪個頁面,只需執行數據庫備份並將請求轉發到正確的操作即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.