В современных мультитенантных системах довольно популярно делать для каждого пользователя или компании отдельный субдомен, например 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
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.