Подстановочные (wildcard) субдомены в маршрутах: каждому пользователю по субдомену

Отдельный субдомен для каждого пользователя в Ларавел

В современных мультитенантных системах довольно популярно делать для каждого пользователя или компании отдельный субдомен, например laraveldaily.slack.com. Как сделать это в Laravel?

Код в routes/web.php довольно прост:

Route::domain('{company_name}.workspace.com')->group(function () {
    Route::get('users', 'UsersController@index');
});

Таким образом, {company_name} может быть любым значением (разумеется, вам необходимо настроить его в DNS-записях вашего домена), и затем оно, в качестве переменной, попадёт в контроллер с тем же именем.

public function index($company_name)
{
    $company = Company::findOrFail($company_name);
    $users = User::where('company_id', $company->id)->get();
    return view('users.index', compact('users'));
}

Погодите… А как же настроить локальное окружение?

С этим файлом маршрутов у нас проблема. Нам нужно настроить локальный сервер так, чтобы был конкретный домен workspace.com? Не волнуйтесь, есть способ решить это — мы сделаем этот домен переменной:

Route::domain('{company_name}.' . env('SITE_URL', 'workspace.com'))->group( // ...

Таким образом, теперь вся строка будет состоять из двух переменных — субдомена и основного домена, которые можно настраивать.

Для вашей локальной среды вы можете настроить например домен workspace.test, а затем добавить в свой файл .env:

SITE_URL=workspace.test

Если Laravel не найдет значение переменной SITE_URL, то по умолчанию будет workspace.com.

Вот и все, удачи в ваших мультитенантных проектах!

 

Автор: Povilas Korop
Перевод: Demiurge Ash