【问题标题】:Laravel: set constant/variable based on domain nameLaravel:根据域名设置常量/变量
【发布时间】:2017-09-29 14:32:51
【问题描述】:

我正在构建一个应用程序,该应用程序具有与其链接的多个域名以及基于并链接到这些域名的不同前端视图/网站。

现在我想根据域名设置一些变量,让它们在我的控制器和应用程序逻辑中可用。

例如,不同前端的所有视图都存储在基于域名(ziv、dbg、dbe)的不同文件夹中。因此,假设用户通过 example.com 访问应用程序,则必须设置一个变量,以便加载的视图来自文件夹“exm”。它看起来像这样:

View::make('frontend.' . $folderVariable . '.home')->with('info', $info);

我的问题是:我应该在哪里放置这样的代码?

它应该在引导文件中,还是在所有其他控制器将继承的基本控制器中?我确实需要整个应用程序中的域名信息,因此需要预先加载。

提前致谢!

【问题讨论】:

  • 我已将其放入项目的基本控制器中。但不确定这是否是最好的方法。
  • 在 Laravel 4.2 中,您可以在位于 /app/filters.phpApp:before() 中执行此操作。使用View::share() 使其在整个视图中可用,或使用Config::set() 使其在任何位置可用。

标签: php laravel domain-name


【解决方案1】:

考虑使用服务类来处理当前域并返回适当的字符串以与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');
    }
}

然后,您将在需要执行特定领域功能的位置插入此类。即 - BaseController,查看功能扩展(您可以使 View::domainMake() 只调用具有给定值的服务类。

【讨论】:

  • 所以在 ServiceProvider 启动方法中我会放置一些逻辑来检查域并设置一些变量?例如,我如何在我的控制器中访问它?
  • 这是一个很好的解决方案,但它只是为了视图。我还希望能够根据域名从我的配置文件中加载不同的 API 密钥。因此,我希望域变量可以在整个应用程序中访问,而不仅仅是视图。您是否认为将此逻辑放在基本控制器的公共函数中并将该方法加载到基本控制器构造函数中更适合我想要的功能?或者这不是最好的解决方案吗?
  • 扩展控制器是一种选择,但如果您在应用程序的不同部分需要该功能怎么办?服务类的使用意味着您可以将该类放置在应用程序中的任何位置并重用它,同时也使其易于测试。然后,您可以在可扩展控制器和视图扩展方法中使用该服务类。如果您之前没有使用过服务类,请查看它,这里有很多可用的教程。
  • 所以你会建议创建一个服务提供商来检查域名的逻辑并在那里设置变量?那么我将如何访问变量呢?
  • 我不会谴责它只是“支持”。我广泛使用它们进行开发。你是对的。我应该从一开始就提到依赖注入。
【解决方案2】:

你可以像这样创建一个中间件:

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

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多