Настройка именованных маршрутов в группе поддоменов в Laravel 5.7

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
2 897
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Немного чище, но я действительно просто хочу передать название маршрута. Хе-хе-хе, спасибо!

Erubiel 11.12.2018 04:43

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

Brian Lee 11.12.2018 05:13

Спасибо чувак! В итоге я создал промежуточное ПО, но в любом случае спасибо за помощь!

Erubiel 11.12.2018 08:06
Ответ принят как подходящий

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

Отсюда я заметил, что вы можете установить значения по умолчанию для всех маршрутов в промежуточном программном обеспечении: 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>

Другие вопросы по теме