Symfony重定向与主机匹配的所有路由

时间:2018-09-04 16:14:42

标签: symfony routing

我有一个Symfony网站,其中有2个域:

  • 着陆(www.landing.com)
  • 主域(www.main.com

我应该对其进行配置,以使与登陆主机(www.landing.com)匹配的每个请求都重定向到首页。主域上的请求应照常运行。

有可能吗?我尝试过此操作,但它仅重定向主页:

/**
 * @Route("/", name="landing", host="www.landing.com")
 */
public function landingAction()
{
    return $this->render('default/landing.html.twig');
}

/**
 * @Route("/", name="homepage")
 */
public function indexAction(Request $request)
{
    return $this->render('default/index.html.twig');
}

2 个答案:

答案 0 :(得分:0)

您可以将www.landing.com的请求转发到首页路线。

Symfony 3.3

中进行了测试

尽管不是很常见,但是您也可以使用forward()方法在内部转发到另一个控制器。而不是重定向用户的浏览器,而是发出“内部”子请求并调用已定义的控制器。

forward()方法返回从该控制器返回的Response对象,只需使用其主机更改主机:

/**
 * @Route("/", name="landing", host="localhost")
 */
public function landingAction() 
{
    // return $this->render('default/landing.html.twig');
    $response = $this->forward('AppBundle:Default:index');
    //further modify the response or return it directly
    return $response;
}

/**
 * @Route("/", name="homepage")
 */
public function indexAction(Request $request) 
{
    return $this->render('default/index.html.twig');
}

甚至,您也可以将参数传递给结果控制器:

 $response = $this->forward('AppBundle:Something:fancy', array(
    'name'  => $name,
    'color' => 'green',
))

参考:https://symfony.com/doc/3.3/controller/forwarding.html

答案 1 :(得分:0)

我最终使用了侦听器并检查了当前页面的主机。这样,我什至可以参数化主机。

这是完整的代码:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class LandingListener
{
    private $landingPageHost;
    private $router;

    public function __construct($landingPageHost, $router)
    {
        $this->landingPageHost = $landingPageHost;
        $this->router          = $router;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request    = $event->getRequest();
        $host       = $request->getHost();
        $isHomepage = 'homepage' == $request->attributes->get('_route');

        // landing page domain
        if (false !== stripos($host, $this->landingPageHost) && !$isHomepage) {
            $url      = $this->router->generate('homepage');
            $response = new RedirectResponse($url);
            $event->setResponse($response);
        }
    }
}

这是服务:

app.landing_listener:
    class: AppBundle\EventListener\LandingListener
    arguments: ['%landing_page_host%', '@router']
    tags:
        - { name: kernel.event_listener, event: kernel.request }