我有一个Symfony网站,其中有2个域:
我应该对其进行配置,以使与登陆主机(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');
}
答案 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',
))
答案 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 }