В современных мультитенантных системах довольно популярно делать для каждого пользователя или компании отдельный субдомен, например 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