Symfony перенаправляет все маршруты, соответствующие хосту - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть один сайт 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 голосов
/ 05 сентября 2018

Я закончил тем, что использовал слушателя и проверил хост текущей страницы. Таким образом, я даже могу параметризовать хост.

Это полный код:

<?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 }
0 голосов
/ 05 сентября 2018

Вы можете переслать запрос 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...