簡體   English   中英

從控制器給出空響應並停止頁面加載-Symfony2

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM