【发布时间】:2019-08-04 20:12:12
【问题描述】:
背景:我想为多个模板网站使用相同的代码。我希望代码能够识别正在访问的域,然后能够设置要在整个应用程序中使用的全局变量。
起初,我创建了 \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 中,他在$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()”行吗?
【问题讨论】:
标签: laravel global-variables middleware