Laravel:根据域名设置constant/variable
Laravel: set constant/variable based on domain name
我正在构建一个应用程序,它有多个链接到它的域名和不同的前端 views/websites 基于并链接到这些域名。
现在我想根据域名设置一些变量,并使它们在我的控制器和应用程序逻辑中可用。
例如,不同前端的所有视图都根据域名(ziv、dbg、dbe)存储在不同的文件夹中。假设,如果用户通过 example.com 访问应用程序,则必须设置一个变量,以便加载的视图来自文件夹 "exm"。它看起来像这样:
View::make('frontend.' . $folderVariable . '.home')->with('info', $info);
我的问题是:我应该把这样的代码放在哪里?
它应该在 bootstrap 文件中,还是在所有其他控制器将继承的基本控制器中?我确实需要整个应用程序的域名信息,所以需要预先加载。
提前致谢!
考虑使用服务 class 来处理当前域,并 return 适当的字符串以与 View::make()
方法一起使用。
或者扩展视图 class \Illuminate\Support\Facades\View
以覆盖 View::make()
或创建另一个自动插入相关字符串的方法。也可选择使用服务提供商。
服务示例class - 它不需要服务提供商(取决于实施)
class DomainResolver
{
private $subdomains;
public function __construct()
{
//Contains sub domain mappings
$this->subdomains = array(
'accounts' => 'ziv',
'billing' => 'exm'
//Etc etc
);
}
public function getView($view)
{
// Should return the current domain/subdomain
// Replace if I'm wrong (untested)
$subdomain = \Route::getCurrentRoute->domain();
if(isset($this->subdomains[$subdomain]))
{
return View::make($this->subdomains[$subdomain].'.'$view);
}
throw new \Exception('Invalid domain');
}
}
然后您可以将此 class 插入到您需要执行域特定功能的位置。即 - BaseController,View 功能扩展(您可以制作 View::domainMake()
,它只会使用给定的值调用服务 class。
您可以像这样创建一个中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class DetectDomainMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($_SERVER['SERVER_NAME'] == 'example.com')
{
define('domain', 'exm');
}
elseif($_SERVER['SERVER_NAME'] == 'example-B.com')
{
define('domain', 'B');
}
return $next($request);
}
}
和register this middleware to the kernel.php as global,因此它将在每个 HTTP 请求上执行。
现在在每个文件(控制器/视图/等)中,您都可以检查您所在的域
<?php
if(domain == 'exn') {..}
if(domain == 'B') {..}
您的查看命令可以更改为
View::make('frontend.' . domain . '.home')->with('info', $info);
我正在构建一个应用程序,它有多个链接到它的域名和不同的前端 views/websites 基于并链接到这些域名。
现在我想根据域名设置一些变量,并使它们在我的控制器和应用程序逻辑中可用。
例如,不同前端的所有视图都根据域名(ziv、dbg、dbe)存储在不同的文件夹中。假设,如果用户通过 example.com 访问应用程序,则必须设置一个变量,以便加载的视图来自文件夹 "exm"。它看起来像这样:
View::make('frontend.' . $folderVariable . '.home')->with('info', $info);
我的问题是:我应该把这样的代码放在哪里?
它应该在 bootstrap 文件中,还是在所有其他控制器将继承的基本控制器中?我确实需要整个应用程序的域名信息,所以需要预先加载。
提前致谢!
考虑使用服务 class 来处理当前域,并 return 适当的字符串以与 View::make()
方法一起使用。
或者扩展视图 class \Illuminate\Support\Facades\View
以覆盖 View::make()
或创建另一个自动插入相关字符串的方法。也可选择使用服务提供商。
服务示例class - 它不需要服务提供商(取决于实施)
class DomainResolver
{
private $subdomains;
public function __construct()
{
//Contains sub domain mappings
$this->subdomains = array(
'accounts' => 'ziv',
'billing' => 'exm'
//Etc etc
);
}
public function getView($view)
{
// Should return the current domain/subdomain
// Replace if I'm wrong (untested)
$subdomain = \Route::getCurrentRoute->domain();
if(isset($this->subdomains[$subdomain]))
{
return View::make($this->subdomains[$subdomain].'.'$view);
}
throw new \Exception('Invalid domain');
}
}
然后您可以将此 class 插入到您需要执行域特定功能的位置。即 - BaseController,View 功能扩展(您可以制作 View::domainMake()
,它只会使用给定的值调用服务 class。
您可以像这样创建一个中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class DetectDomainMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($_SERVER['SERVER_NAME'] == 'example.com')
{
define('domain', 'exm');
}
elseif($_SERVER['SERVER_NAME'] == 'example-B.com')
{
define('domain', 'B');
}
return $next($request);
}
}
和register this middleware to the kernel.php as global,因此它将在每个 HTTP 请求上执行。
现在在每个文件(控制器/视图/等)中,您都可以检查您所在的域
<?php
if(domain == 'exn') {..}
if(domain == 'B') {..}
您的查看命令可以更改为
View::make('frontend.' . domain . '.home')->with('info', $info);