Laravel 7.1 - URL :: defaults () не работает в промежуточном программном обеспечении высокого приоритета - PullRequest
0 голосов
/ 12 марта 2020

Я интенсивно использую маршрутизацию на субдоменах в своем проекте, так как это мультитенантное приложение, у каждого арендатора есть собственный субдомен.

В результате все мои маршруты заключены в:

Route::domain('{tenant}.'.config('app.base_url'))->group(function () {
    // My routes here!
});

Чтобы использовать помощник route() в моем коде, мне нужно передать ему все параметры маршрута, связанные с ним. С каждым отдельным маршрутом связано tenant, поэтому я постоянно повторяю код и пишу route('my-route-name', ['tenant' => $request->route('tenant')]);

Я создал промежуточное программное обеспечение со следующим кодом:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use URL;

class SetTenantFromRequest
{
    public function handle(Request $request, Closure $next)
    {
        list($subdomain) = explode('.', $request->getHost(), 2);
        URL::defaults(['tenant' => $subdomain]);

        return $next($request);
    }
}

И поместил его в файл HTTP Kernel.php примерно так:

protected $middleware = [
    TrustProxies::class,
    CheckForMaintenanceMode::class,
    ValidatePostSize::class,
    TrimStrings::class,
    ConvertEmptyStringsToNull::class,
    WebHeaders::class,
    SetLanguage::class,
    SetTenantFromRequest::class,
];

// Removed for brevity...
protected $middlewarePriority = [
    StartSession::class,
    ShareErrorsFromSession::class,
    SetTenantFromRequest::class,
    Authenticate::class,
    ThrottleRequests::class,
    AuthenticateSession::class,
    SubstituteBindings::class,
    Authorize::class,
];

Мне пришлось добавить его в массив $middlewarePriority, так как он должен работать до промежуточного программного обеспечения Authenticate. Так как Authenticate вызывает return route('login');, мне нужно, чтобы этот параметр URL был доступен заранее.

Теперь, выполнив все это, я все еще получаю следующую ошибку из промежуточного программного обеспечения Authenticate: Missing required parameters for [Route: login] [URI: login].

Если я запускаю ddd(URL::getDefaultParameters()); в промежуточном программном обеспечении Authenticate, он печатает пустой массив. Однако, если я запускаю тот же ddd(...) в промежуточном программном обеспечении SetTenantFromRequest, он показывает арендатора там, как я и ожидаю.

У кого-нибудь есть идеи, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 12 марта 2020

Перемещение этого из глобального стека промежуточного программного обеспечения в стек веб-промежуточного программного обеспечения облегчает проблему.

Это вынуждает меня добавить параметр арендатора к вызову route(...) в моем промежуточном программном обеспечении Authenticate, но это позволяет мне для go это повсюду.

...