重定向内核请求

时间:2014-03-18 12:27:19

标签: php symfony

我的项目的网站可以通过子域访问,例如https://1234.example.com子域由四个数值组成,表示特殊用户实体的ID。因此,当发出请求时,我必须检查该ID是否确实存在,如果不存在,我想重定向到根URL https://www.example.com。如果用户使用了正确的id,则无需执行任何操作。 我做了一个事件监听器并检查了id的存在。这与预期的一样。但重定向到根网址无法工作:

public function onKernelRequest(GetResponseEvent $event)
{
    if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
        return;
    }

    $request = $event->getRequest();

    $hostArray = explode('.', $request->getHost());
    $subdomain = $hostArray[0];

    array_shift($hostArray);
    $host = implode('.', $hostArray);

    if (!is_numeric($hostArray[0])) {
        return new RedirectResponse($host);
    }

    $user = $this->userManager->findUserBy(['id' => $subdomain]);
    if (null === $user) {
        return new RedirectResponse($host);
    }
}

即使ID不存在,网址也不会更改。当我调试代码时,我可以看到他到达了RedirectResponse。但没有任何反应。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

听众不会想要返回任何内容。如果要触发重定向,请在事件上设置响应:

public function onKernelRequest(GetResponseEvent $event)
{
    if (!$event->isMasterRequest()) {
        return;
    }

    $hostArray = explode('.', $event->getRequest()->getHost());
    $subdomain = $hostArray[0];

    array_shift($hostArray);
    $host = implode('.', $hostArray);

    if (is_numeric($subdomain) && $user = $this->userManager->findUserBy(['id' => $subdomain])) {
        // you can pass the user as an attribute if you need him later
        $event->getRequest()->attributes->set('user', $user);

        return;
    }

    $event->setResponse(new RedirectResponse($host));
}