Настройка именованных маршрутов в группе поддоменов в Laravel 5.7 - PullRequest
0 голосов
/ 11 декабря 2018

Я работал над мультитенантным приложением и пытаюсь настроить маршруты в поддоменах в соответствии с документацией: 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');        
});

В настоящее время проблема заключается в использовании именованных маршрутов в blade-сервере, но я полагаю, что в конечном итоге я могу столкнуться с той же проблемой в моих контроллерах.

Всякий раз, когда я пытаюсь использовать именованный маршрут, подобный этому:

Код Blade

<a href="{{ route('home') }}">Home</a>

Я получаю следующую ошибку:

Отсутствуют обязательные параметры для [Route: home] [URI: home].(Просмотр: /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>

Но мне все еще интересно, есть либолее чистый способ сделать это, может быть, с помощью некоторого промежуточного программного обеспечения, которое всегда вводит параметр?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Это мой ответ на мой собственный вопрос на случай, если кому-то понадобится это в будущем:

Отсюда я заметил, что вы можете установить значения по умолчанию для всех маршрутов в промежуточном программном обеспечении: 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');        
});
* 1021И, наконец, как обычно, используйте вспомогательную функцию маршрута:
<a href="{{ route('home') }}">Home</a>
0 голосов
/ 11 декабря 2018

Вы можете использовать переменную account (subdomain) для всех представлений:

// 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>
...