Laravel маршрут работает с поддоменом в 2 средах - PullRequest
0 голосов
/ 07 февраля 2020

Я кодирую платформу для создания суб-сайтов.

У меня есть такой маршрут, который очень хорошо работает на местном:

//Website
Route::domain('{slug}.domain.test')->group(function () {
    Route::get('/','WebsitesController@show')->name('web_website_show');
});

Я хочу иметь возможность сделать он работает также в производственном (другом домене), поэтому я сделал:

//Website
Route::domain('{slug}.{domain}')->group(function () {
    Route::get('/','WebsitesController@show')->name('web_website_show');
});

И в моем шаблоне:

<a href="{{ route('web_website_show',['slug' => $website->slug, 'domain' => Request::getHost() ]) }}">Website</a>

Сгенерированный URL выглядит потрясающе, но маршрутизация не работать и привести меня на родительскую страницу основного домена.

Что я делаю не так?

Спасибо

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Работа с маршрутами доменов, подобная этой, немного затрудняет Laravel.

Недавно в приложении я проанализировал часть домена по URL-адресу приложения, а затем установил ее в качестве значения конфигурации, например это:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        config([
            'app.domain' => parse_url(config('app.url'), PHP_URL_HOST),
        ]);
    }
}

Затем вы можете использовать это в маршрутах вашего домена:

Route::domain('{slug}.'.config('app.domain'), function () {
    // Subdomain routes that work in all environments
});
1 голос
/ 08 февраля 2020

Если вы используете laravel homestead, вам нужно зарегистрировать каждый поддомен в файле etc / hosts и в Homestead.yaml , как вы, вероятно, сделали с основной домен. Теперь я порекомендую структуру:

app.test
subdomain1.app.test
subdomain2.app.test

Я бы не рекомендовал использовать что-то вроде:

subdomain1.app1.test
subdomain2.app2.test

Я имею в виду, вы могли бы, но это не очень много смысл, и вам также придется зарегистрировать все это в вашей среде Homestead / Local и Production.

Для подхода, который я предлагаю, вы можете настроить это для переменной среды. https://laravel.com/docs/6.x/configuration#environment -variable-types

Вы можете добавить любую переменную env, которая вам нужна / нужна, в файл .env, есть переменная APP_URL, но это включает протокол http, который вы можете добавить что-то вроде:

APP_DOMAIN=app.test

И для производства

APP_DOMAIN=yourapp.com

Затем в файле маршрутов доступ к нему с помощью вспомогательного метода env, вы можете опустить второй параметр или использовать его для установите значение по умолчанию, если вы забудете поместить его в файл .env.

Route::domain('{slug}.' . env('APP_DOMAIN', 'default.com'))->group(function () {
    Route::get('/','WebsitesController@show')->name('web_website_show');
});

Кстати, это может помочь при настройке значения слагов с именованными маршрутами: Настройка именованных маршруты внутри группы поддоменов в Laravel 5.7

...