从控制器给出空响应并停止页面加载 - Symfony2
Give a null response from controller and stop page load - Symfony2
我正在使用 Symfony2 并且我有一些代码要执行。它执行一些数据库备份类型的工作。这对这个问题并不重要。
我想要的是当我按下按钮时它会执行代码并返回主视图。不要加载/重新加载任何页面。但是控制器总是在等待响应。
The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?
所以我试着用 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 是可能的。
HTTP 没有 "current" 视图的正确概念,因为它是无状态的。这是一个 request / response 协议,因此用户请求 Web 服务器的任何操作都必须通过某种响应来回答。
也就是说,似乎 停留在同一页面上是完全有效的。您可以使用 ajax 或通过发送与用户按下按钮之前相同的内容/响应来响应。您可以使用 HTTP_REFERER
,但那是 not 100% reliable so you may want to use another method. Alternatively, if you know for sure which page you want to redirect the user to, simply do your db backup and forward 对正确操作的请求。
下载 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 class 可能是更好的选择,因为这样它不会在内存中加载文件内容:
$response = new StreamedResponse(function() use ($zipfname) {
readfile($zipfname);
});
// set headers
return $response;
我正在使用 Symfony2 并且我有一些代码要执行。它执行一些数据库备份类型的工作。这对这个问题并不重要。
我想要的是当我按下按钮时它会执行代码并返回主视图。不要加载/重新加载任何页面。但是控制器总是在等待响应。
The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?
所以我试着用 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 是可能的。
HTTP 没有 "current" 视图的正确概念,因为它是无状态的。这是一个 request / response 协议,因此用户请求 Web 服务器的任何操作都必须通过某种响应来回答。
也就是说,似乎 停留在同一页面上是完全有效的。您可以使用 ajax 或通过发送与用户按下按钮之前相同的内容/响应来响应。您可以使用 HTTP_REFERER
,但那是 not 100% reliable so you may want to use another method. Alternatively, if you know for sure which page you want to redirect the user to, simply do your db backup and forward 对正确操作的请求。
下载 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 class 可能是更好的选择,因为这样它不会在内存中加载文件内容:
$response = new StreamedResponse(function() use ($zipfname) {
readfile($zipfname);
});
// set headers
return $response;