我正在构建一个应用程序,该应用程序具有链接到它的多个域名以及基于并链接到这些域名的不同前端视图/网站。
现在我想根据域名设置一些变量,并使它们在我的控制器和应用程序逻辑中可用。
例如,根据域名(ziv,dbg,dbe),不同前端的所有视图都存储在不同的文件夹中。因此,让我们说,如果用户通过example.com到达应用程序,则必须设置一个变量,以便加载的视图将来自文件夹" exm"。它看起来像这样:View::make('frontend.' . $folderVariable . '.home')->with('info', $info);
我的问题是:我应该在哪里放置此类代码?
它应该在bootstrap文件中,还是在所有其他控制器都将继承的基本控制器中?我确实需要整个应用程序中域名的信息,因此需要预先加载。
提前致谢!
答案 0 :(得分:1)
考虑使用Service类来处理当前域并返回适当的字符串以与View::make()
方法一起使用。
或者扩展View类\Illuminate\Support\Facades\View
以覆盖View::make()
或创建另一个自动插入相关字符串的方法。也可选择使用服务提供商。
服务类示例 - 它不需要服务提供者(取决于实现)
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');
}
}
然后,您需要在需要执行特定于域的功能的位置插入此类。 I.e - BaseController,查看功能扩展(您可以使View::domainMake()
只使用给定的值调用服务类。
答案 1 :(得分:0)
您可以创建这样的中间件:
<?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);