Laravel 5 - 按请求确定的一个服务器/多个数据库

时间:2016-02-23 16:51:11

标签: php laravel environment-variables

所以我正在开发一个有两种部署的应用程序。一个是他们托管所有东西,有一个应用程序/一个数据库,没有问题。第二个(这个问题将以中心为中心)将有一个应用程序,但每个客户端有不同的数据库连接。

每个域的访问权限都会列入白名单,因此我们不必担心一个客户端会弹出另一个客户端域,并且他们的身份是其他身份验证。

我需要的是双重的:

  1. 一种确定访问应用程序的客户端的方法(请求标头?域驱动?)
  2. 获取所述客户端的配置,以便他们只访问其数据库信息(使用基于客户端的某个.env文件?)。
  3. 我想到的一个想法是使用apache根据请求的域设置env变量。但是,我更愿意将这种处理保留在laravel中。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我们做这件事。如您所述,您需要一些权限,可以将域映射到客户端,然后远离以获取客户端特定的设置。

以下是我们如何设置它:

  1. 我们为每个客户端提供不同的Apache vhost,以及客户端已设置的所有域/别名。在vhost文件中,Apache为我们提供了一个单独的env变量CLIENT_ID。这样我们就知道客户是谁,无论在任何时候使用哪个域别名。

  2. 我们有一个Laravel服务提供商,然后查看env('CLIENT_ID')并设置了许多配置选项。设置的一个方面是特定于客户端的路径,我们在其中存储许多特定于客户端的资源和文件。所以我们正在做这样的事情:

    Config::set("paths.client", "/var/www/clients/" . env("CLIENT_ID"));

  3. 现在我们已经设置了特定于客户端的路径,我们可以使用Dotenv为该客户端加载特定于客户端的.env文件。请注意,我们的app目录中仍然有一个根.env文件(Laravel期望它),它设置了公共配置。特定于客户端的.env文件设置客户端特定的内容,如SMTP设置,当然还有数据库连接设置。

    Dotenv::load(Config::get("paths.client"));

  4. 现在加载了特定于客户端的.env,我们可以轻松地写入database.connections配置数组。从那以后,雄辩,其他一切正常。

    Config::set('database.connections.mysql', [ 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), ]);

  5. 当然,你不必这样做。我们选择Apache vhosts作为将域映射到客户端的权限,但您可以拥有主数据库或仅配置文件。然后在您的服务提供者中,您只需要询问主数据库(或配置文件)需要设置哪些客户端。

    如果您不想存储单独的.env文件,那么您的客户端设置甚至可以位于主数据库或配置文件中。你可以通过很多方法给这只猫上皮。

    最终,无论你到达那里,一旦你设置了数据库配置连接数组,你就可以了。

    更新

    对于将来阅读此内容的任何人,还有另一种非常简单的方法来加载下面评论中提到的备用.env文件:

      

    如果在到达Laravel(虚拟主机等中的SetEnv)之前以某种方式设置APP_ENV,它将默认查找.env。 APP_ENV (例如:.env.demo)文件。我正在使用SetEnv设置APP_ENV,然后为每个客户端创建.env文件。

    出于我们的目的,我们不希望客户端特定的.env文件位于我们应用的根目录中。但它可以很好地适用于其他情况。