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


Laravel 5 - One server / multiple databases determined by request

所以我正在开发一个有两种部署的应用程序。一个是它们托管所有内容,只有一个应用程序/一个数据库,没有任何问题。第二个(这个问题将围绕它展开(将有一个应用程序,但每个客户端有不同的数据库连接。

对每个域的访问都将被列入白名单,所以我们不必担心一个客户端弹出另一个客户端的域,而他们的域是其他身份验证。

我需要两个方面:

  1. 一种确定访问应用程序的客户端的方法(请求头?域驱动?(
  2. 获取所述客户端的配置,使其仅访问其数据库信息(使用基于客户端的特定.env文件?(

我想到的一个想法是使用apache根据请求的域设置env变量。然而,我更愿意将这种处理方式保留在laravel内部。有什么想法吗?

我们正是这样做的。正如您所指出的,您需要一些权限,可以将域映射到客户端,然后通过away获取客户端特定的设置。

以下是我们的设置方法:

  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文件。请注意,我们的应用程序目录中仍然有一个根.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'), ]);

当然,你不必这样做。我们选择Apache vhosts作为将域映射到客户端的权限,但您可以有一个master数据库,也可以只有一个配置文件。然后在服务提供商中,您只需要询问master数据库(或配置文件(需要设置什么客户端。

如果您不想存储单独的.env文件,您的客户端设置甚至可以在master数据库或配置文件中。你可以用很多方法剥这只猫的皮。

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

更新

对于将来读到这篇文章的人来说,还有另一种非常简单的方法来加载备用.env文件,如下面的评论所述:

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

出于我们的目的,我们不希望客户端特定的.env文件位于应用程序的根目录中。但它在其他情况下也能很好地工作。

相关文章: