Я работаю над мультитенантным приложением и пытаюсь настроить маршруты в поддоменах в соответствии с документацией: https://laravel.com/docs/5.7/routing#route-group-sub-domain-routing
В моем файле маршрута web.php у меня есть что-то вроде этого:
Route::domain('{account}.example.test')->group(function () {
Route::get('/home', 'HomeController@index')->name('home');
});
Прямо сейчас проблема заключается в использовании именованных маршрутов в блейде, но я полагаю, что в конечном итоге я могу столкнуться с той же проблемой в своих контроллерах.
Каждый раз, когда я пытаюсь использовать такой именованный маршрут:
Код лезвия
<a href = "{{ route('home') }}">Home</a>
Я получаю следующую ошибку:
Missing required parameters for [Route: home] [URI: home]. (View: /home/vagrant/Code/example/resources/views/example.blade.php)
Я нашел способ решить эту проблему, вам просто нужно:
<a href = "{{ route('home', request('account')) }}">Home</a>
Я тоже "решил" это с помощью помощника ...
if (! function_exists('acctRoute')) {
function acctRoute($name = '')
{
return route( $name, request('account'));
}
}
Так что я могу использовать это как:
<a href = "{{ acctRoute('home') }}">Home</a>
Но мне все еще интересно, есть ли более чистый способ сделать это, может быть, с каким-то промежуточным программным обеспечением, которое всегда вводит параметр?






Вы можете использовать переменную аккаунта (поддомена) во всех представлениях:
// AppServiceProvider
public function boot()
{
View::share('subdomain', request('account'));
}
// blade
<a href = "{{ route('home', $subdomain) }}">Home</a>
Другой подход может использовать привязку контейнера службы:
// AppServiceProvider
$this->app->bind('account.route', function () {
return route('home', request('route'));
});
// blade
<a href = "{{ app('account.route') }}">Home</a>
Возможно, для этого потребуется использовать контейнер службы или глобальный вспомогательный метод. Добавил пример первого.
Спасибо чувак! В итоге я создал промежуточное ПО, но в любом случае спасибо за помощь!
Это мой ответ на свой вопрос на тот случай, если кому-то это понадобится в будущем:
Отсюда я заметил, что вы можете установить значения по умолчанию для всех маршрутов в промежуточном программном обеспечении: https://laravel.com/docs/5.7/urls#default-values
Итак ... Это то, что я в итоге сделал
Сначала создайте промежуточное ПО:
php artisan make:middleware MyMiddleware
Затем обновите метод handle внутри созданного промежуточного программного обеспечения, как в примере документации:
public function handle($request, Closure $next)
{
URL::defaults(['account' => request('account')]);
return $next($request);
}
Затем зарегистрируйте промежуточное ПО в Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'mymiddle' => \App\Http\Middleware\MyMiddleware::class,
];
Затем используйте его как любое другое промежуточное ПО в своих файлах маршрутов:
Route::domain('{account}.example.test')->middleware('mymiddle')->group(function () {
Route::get('/home', 'HomeController@index')->name('home');
});
И, наконец, как обычно, используйте вспомогательную функцию маршрута:
<a href = "{{ route('home') }}">Home</a>
Немного чище, но я действительно просто хочу передать название маршрута. Хе-хе-хе, спасибо!