在我的应用程序中,我使用init函数来初始化一个动作 init函数验证用户输入 (例如,用户正在寻找不存在的产品 - > init函数应该将他重定向到errorpage“产品......未找到”)
/**
* @Route("/route/{var}", name="xyzbundle_xyz_index")
* @Template("VendorXyzBundle:xyz:index.html.twig")
*/
public function indexAction ($var)
{
$xyz = $this->initxyz($var);
...
.. more code
.
}
此控制器中有一个私有函数,应该验证来自url给定参数,如果它是错误的(在数据库等中不存在),私有函数应该重定向
private function init($var)
{
if($this->databasesearchforexyz($var)){
// redirect to Errorpage (No xyz found named ...)
return $this->redirect($this->generateUrl('xyz_error_...'));
}
if($this->checksomethingelse($var)){
// redirect to some other error page
}
}
请注意,这些不是我真正的方法/变量/路径/等。名。
问题是,它没有重定向。
答案 0 :(得分:5)
您可以检查init函数是否返回实际响应,然后您可以直接从主代码返回它。像这样:
public function indexAction ($var)
{
$xyz = $this->initxyz($var);
if ($xyz instanceof \Symfony\Component\HttpFoundation\Response) {
return $xyz;
}
...
.. more code
.
}
顺便说一句,如果您只需要检查数据库是否存在,您可以使用symfony的paramconverter
答案 1 :(得分:1)
这是一些建议。
如果没有重定向,则从init函数返回true
,如果有重定向,则返回false
。
示例:
private function init($var) {
if ($error) {
// An error occurred, redirect
$this->redirect($this->generateUrl('xyz_error_...'));
return false;
}
// Else, everything alright
return true;
}
public function indexAction ($var) {
if (!$this->init($var)) {
// Failed to init, redirection happening
return;
}
// Continue as normal
}
答案 2 :(得分:0)
使用@ alex88的答案,我聚合了一个异常和异常监听器来进行重定向。这样可以避免我一遍又一遍地重复这个条件,因为我的函数可以在不同的场景下重定向用户。
<强> 1。控制器强>
namespace AppBundle\Controller;
use AppBundle\Exception\UserHasToBeRedirectedException;
class DefaultController extends Controller
{
public function indexAction(...)
{
...
$this->userHasToBeRedirected();
...
}
private function userHasToBeRedirected()
{
...
if ($userHasToBeRedirected) {
$response = $this->redirect($this->generateUrl(...));
throw new UserHasToBeRedirectedException($response);
}
...
}
}
<强> 2。例外强>
namespace AppBundle\Exception;
use Exception;
use Symfony\Component\HttpFoundation\Response;
class UserHasToBeRedirectedException extends Exception
{
private $response;
public function __construct(Response $response)
{
$this->response = $response;
}
public function getResponse()
{
return $this->response;
}
public function setResponse(Response $response)
{
$this->response = $response;
return $this;
}
}
第3。例外监听器
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use AppBundle\Exception\UserHasToBeRedirectedException;
class ExceptionListener
{
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
...
if ($exception instanceof UserHasToBeRedirectedException) {
$response = $exception->getResponse();
$event->setResponse($response);
}
...
}
}
<强> 4。在service.yml
注册服务...
appBundle.exception_listener:
class: AppBundle\EventListener\ExceptionListener
tags:
- { name: kernel.event_listener, event: kernel.exception }
...