Настройте хост по умолчанию для маршрутов в Symfony 4

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

Допустим, мое приложение размещено на example1.com. Мне нужно разместить несколько страниц на example2.com.

Поэтому я создал новый контроллер:

class NewsletterController extends AbstractController
{
    /**
     * @Route("/unsubscribe", name="newsletter_unsubscribe", host="example2.com")
     */
    public function unsubscribe(): Response
    {
        return $this->render('newsletter/unsubscribe.html.twig');
    }
}

Это отлично работает; страница обслуживается правильно, а путь /unsubscribe маршрутизируется только при запросе на example2.com. На example1.com он возвращает 404, как и ожидалось.

Проблема в том, что теперь все маршруты, предназначенные для сопоставления в основном домене example1.com, также сопоставляются в example2.com, чего я не хочу.

Конечно, я мог бы изменить все остальные аннотации @Route, чтобы включить host="example1.com", но это громоздко и чревато ошибками в будущем.

Есть ли способ требовать host для всех маршрутов по умолчанию, если это не переопределено в аннотации @Route?


person BenMorel    schedule 19.12.2019    source источник
comment
Вы пытались настроить onKernelRequest Listener для разбора всех запросов перед маршрутизацией?   -  person bZezzz    schedule 19.12.2019
comment
@bZezzz Нет, я надеялся, что для этой цели есть простое значение конфигурации!   -  person BenMorel    schedule 19.12.2019
comment
Пробовали @Route перед вашим классом, а не перед вашей функцией, и разделили ваш контроллер для каждого домена?   -  person bZezzz    schedule 19.12.2019
comment
@bZezzz Настройка @Route над каждым классом контроллера будет работать и будет немного лучше, чем для каждого метода контроллера, я согласен. Тем не менее, если бы была глобальная настройка конфигурации, мне было бы удобнее!   -  person BenMorel    schedule 19.12.2019
comment
буду искать ;)   -  person bZezzz    schedule 19.12.2019
comment
С ReflectionClass вы не можете анализировать аннотации, чтобы проверить, содержит ли host ? Может быть решение   -  person bZezzz    schedule 19.12.2019
comment
@bZezzz Я бы знал, как его взломать, но точно нет ;-)   -  person BenMorel    schedule 19.12.2019
comment
Аннотации можно легко разобрать и без всякого взлома;) Так что удачи, чувак.   -  person bZezzz    schedule 19.12.2019
comment
@bZezzz Пока кто-нибудь не придумает лучшее решение, я буду использовать параметр @Route для каждого класса контроллера. Если вы хотите написать ответ, я приму его!   -  person BenMorel    schedule 19.12.2019


Ответы (2)


Это не окончательное решение, но может помочь...

Вы можете установить аннотацию @Route для каждого класса контроллера и разделить свои контроллеры для каждого домена...

/**
 * @Route(host="example2.com")
 */
class NewsletterController extends AbstractController
{
    /**
     * @Route("/unsubscribe", name="newsletter_unsubscribe")
     */
    public function unsubscribe(): Response
    {
        return $this->render('newsletter/unsubscribe.html.twig');
    }
}

Мы скоро найдем лучшее решение :)

person bZezzz    schedule 19.12.2019
comment
На самом деле это даже лучше: если вы определяете аннотацию @Route и для класса, и для метода, аннотации объединяются, поэтому вы можете определить host на уровне класса, а остальные — на уровне метода. Таким образом, вы можете организовать свои контроллеры, имея в них несколько методов. Я отредактировал ваш ответ, чтобы отразить это! - person BenMorel; 19.12.2019

Вы можете определить хост по умолчанию в annotation.yaml

//config\routes\annotations.yaml

controllers:
    resource: ../../src/Controller/
    type: annotation
    host: mydomain.com
person Cedric    schedule 25.06.2021