Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 31.03.2017 22:36:28

Динамические сабдомены (Laravel 5.2)

Есть работающий проект, но появилась задача для части сайта сделать сабдомены вида {city}.mydomain.com.
Вроде всё понятно, в routes.php создаём группу и добавляем туда параметр ’domain’:

PHP
$router->group([
    
'domain' => '{subdomain}.mysomain.com',
], function () {
    ....
});

Далее в эту группу переносим все необходимые нам руты и как бы всё хорошо. Но! У нас появляется новый параметр $subdomain который надо прописать для ВСЕХ контроллеров в группе. Это ещё пол беды. Дальше нам нужно найти ВСЕ route() из этой группы и туда также присобачить переменную $subdomain.

Как обойти вопрос с контроллерами я в принципе нашел — создаём middleware и там вырезаем этот параметр, предварительно записав его, например, в сессию.

Но вот как быть со всеми рутами (в редиректах, темплейтах, письмах и т.д.) я пока не нашел. Как сделать так, чтобы ко всем рутам в группе с сабдоменом эта динамическая переменная прописывалсь сама?
Может кто сталкивался?

Не в сети

#2 01.04.2017 07:12:33

Re: Динамические сабдомены (Laravel 5.2)

с параметром всё просто – он не обязательно должен выбираться параметрами экшена. если какая-то логика в каких-то контроллерах зависит от поддомена, его всегда можно выбрать из запроса с $request->get()

с генерацией ссылок всё немного интереснее. здесь важно то что все хелперы в итоге заворачиваются на Illuminate\Routing\UrlGenerator, доступен через фасад \URL, у него есть методы forceSchema (позволяет принудительно всегда генерить ссылки с https:// если веб-сервер не прокидывает в код параметр HTTPS=on) и forceRoot. тут я чисто теоретически предполагаю что через forceRoot можно заставить его делать абсолютные ссылки на определённый домен. если да, то не нужно прописывать логику во все экшены, достаточно добавить миддлварь, которая при наличии $subdomain в $request будет форсировать все ссылки на этот поддомен

третий момент, о котором важно сказать – однажды, и судя по всему как дела движутся – очень скоро, тебе придётся ставить на сайт ssl-сертификат. и вот тут твои поддомены (если их много) окажут тебе медвежью услугу. дело в том что бесплатный letsencrypt не выпускает wildcard-сертификаты, и количество доменов в одном сертификате ограничено. я бы сейчас старался избегать использования поддоменов в маршрутизации вот чисто по той причине, чтобы в перспективе не платить 10т.р. в год за wildcard

Не в сети

Подвал раздела