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);