Laravel - Использование значений, возвращаемых из Middleware Group для глобальных переменных - PullRequest
1 голос
/ 14 марта 2019

Справочная информация. Я хочу использовать один и тот же код для нескольких шаблонных веб-сайтов.Я хочу, чтобы код идентифицировал домен, к которому осуществляется доступ, и затем смог установить глобальные переменные, которые будут использоваться в приложении.

Сначала я создал \ config \ global.php, и там его логика работала какОжидается:

$webUrl = url()->current();

/**************************************************
 * Set Conference name based on URL
 **************************************************/
$confId = 0;
$confName = '';
$confAbbrev = '';
if(strpos($webUrl, 'webdomain1') > 0) {
    $confName = 'Domain 1 Full Name';
    $confAbbrev = 'Dom1';
    $confId = 25;
}
elseif(strpos($webUrl, 'webdomain2') >0) {
    $confName = 'Domain 2 Full Name';
    $confAbbrev = 'Dom2';
    $confId = 35;
}

Однако в конечном итоге я обнаружил, что «url ()» вызывал ошибки, которые не позволяли мне использовать команды «php artisan» во всем приложении.Посоветовавшись с моим профессиональным коллегой по веб-разработке, он сказал, что использование «глобального» конфигурационного файла для глобальных переменных не является лучшей практикой, и вместо этого рекомендовал Middleware.Он взял под свой контроль мой ноутбук и пошел очень быстро ...

В \ app \ Http \ Kernel.php он добавил строку SetDomainVariables в конце $ middlewareGroups:

    protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\SetDomainVariables::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

Затем он создал новый файл: \ app \ Http \ Middleware \ SetDomainVariables.php

<?php

namespace App\Http\Middleware;

use Closure;

class SetDomainVariables
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        dd($request->getHttpHost());
        return $next($request);
    }
}

Результаты "$ request-> getHttpHost ()" - это то, что мне нужно ... он возвращает "foo"www.foo.com.Тем не менее, я не знаю, как присвоить это значение переменной и вернуть его через «$ next», а затем как я могу разместить вокруг нее логику, чтобы установить свои глобальные переменные, на которые я могу ссылаться в партиале Blade, и т. Д.

Спасибо!

РЕДАКТИРОВАТЬ: Если использование \ config \ global.php действительно правильный способ выполнить то, что я хочу, могу ли я просто закомментировать строку "url ()", когда захочусделать команду "php artisan"?

1 Ответ

1 голос
/ 14 марта 2019

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

  1. Создать новыйфайл с именем config/sites.php, содержащий массив для каждого из ваших сайтов, гарантирующий, что вы начнете каждый домен с www и замените все . в домене на - (потому что . в ключе конфигурации не будет работать как Laravelиспользует точку для доступа к дочерним значениям).
return [
    'default' => [
        'id' => 15,
        'name' => 'Default Full Name',
        'abbreviation' => 'Def',
    ],
    'www-webdomain1-com' => [
        'id' => 25,
        'name' => 'Domain 1 Full Name',
        'abbreviation' => 'Web1',
    ],
    'www-webdomain2-com' => [
        'id' => 35,
        'name' => 'Domain 2 Full Name',
        'abbreviation' => 'Web2',
    ],
];

Теперь у вас есть значения конфигурации для каждого из ваших сайтов, доступных в любом месте вашего приложения, например: config('sites.www-webdomain1-com.name').

Добавьте следующее в ваше промежуточное ПО:
public function handle($request, Closure $next)
{
    $host = str_slug(starts_with('www.', $request->getHttpHost()));

    $configuration = config("sites.{$host}") ?: config('sites.default');

    config(['site' => $configuration]);

    return $next($request);
}

Теперь вы установили значение конфигурации для ключа site для содержимого конфигурации сайта, которое вы установили в config/sites.php длядомен запроса.

Везде, где вам нужен доступ к параметру конфигурации активного сайта, используйте config('site.property'), например:
Hello, welcome to {{ config('site.name') }}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...