Laravel-使用从中间件组返回的值进行全局变量的值



背景:我想对多个模板网站使用相同的代码。我希望代码可以识别访问的域,然后能够在整个应用程序中设置全局变量。

首先,我创建了 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"命令。在咨询了我的专业Web开发人员同事之后,他说,使用"全局"配置文件进行全球变量是最佳实践,而是推荐中间件。他控制了我的笔记本电脑,走得很快...

在 app http kernel.php中,他在$ MiddlewareGroup的末尾添加了setDomainVariables线:

    protected $middlewareGroups = [
    'web' => [
        AppHttpMiddlewareEncryptCookies::class,
        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
        IlluminateSessionMiddlewareStartSession::class,
        // IlluminateSessionMiddlewareAuthenticateSession::class,
        IlluminateViewMiddlewareShareErrorsFromSession::class,
        AppHttpMiddlewareVerifyCsrfToken::class,
        IlluminateRoutingMiddlewareSubstituteBindings::class,
        AppHttpMiddlewareSetDomainVariables::class,
    ],
    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

然后,他创建了一个新文件: app http middleware setDomainvariables.php

<?php
namespace AppHttpMiddleware;
use Closure;
class SetDomainVariables
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        dd($request->getHttpHost());
        return $next($request);
    }
}

" $ request-> gethttphost()"的结果是我需要的...它返回www.foo.com的" foo"。但是,我不知道如何将此值分配给变量并通过" $ next"返回它,然后我如何将逻辑围绕它设置我可以在刀片部分中引用的全局变量,等等。P>

谢谢!

编辑:如果使用 config global.php确实是完成我想要的工作的正确方法,那么我只要我想执行" php artisan"命令,就可以评论" url()"行?<<<<

有几种不同的方法来解决此问题,最简单的是使用config - 它允许您动态获取和设置配置值。

  1. 创建一个名为config/sites.php的新文件,称为每个站点的数组,确保您使用www启动每个域,并用-替换域中的任何.(因为config键中的 .在config键中不起作用,因为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')

  1. 将以下内容添加到您的中间件:
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中为请求域设置的站点配置的内容。

  1. 您需要访问活动网站的配置选项的任何地方使用config('site.property'),例如:
Hello, welcome to {{ config('site.name') }}

有更好的方法来解决此问题,我个人会创建一个Site模型,然后使用路由模型绑定,但是我在这里概述的方式非常容易为初学者设置,并且应该满足您的需求。

相关内容

  • 没有找到相关文章

最新更新