背景:我想对多个模板网站使用相同的代码。我希望代码能够识别正在访问的域,然后能够设置要在整个应用程序中使用的全局变量。
首先,我创建了\ 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开发人员同事之后,他说对全局变量使用“全局”配置文件不是最佳实践,而是建议使用Middleware。他控制了我的笔记本电脑,并且运行得非常快...
在\ app \ Http \ Kernel.php中,他在$ middlewareGroups的末尾添加了SetDomainVariables行:
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()”的结果...它返回www.foo.com的“ foo”。但是,我不知道如何将该值分配给变量并通过“ $ next”将其返回,然后不知道如何围绕它设置逻辑以设置可在Blade局部中引用的全局变量等。>
谢谢!
编辑:如果使用\ config \ global.php确实是完成我想要的事情的正确方法,那么每当我想执行“ php artisan”命令时,是否可以将“ url()”行注释掉? / p>
答案 0 :(得分:1)
有几种方法可以解决此问题,最简单的方法就是使用config
,它使您可以动态获取和设置配置值。
config/sites.php
的新文件,其中包含每个站点的数组,请确保您以www
开始每个域,并用.
替换该域中的任何-
(因为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')
。
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
模型,然后使用Route Model Binding,但是对于初学者来说,我这里概述的方法很容易设置,应该满足您的需求。