所以我正在开发一个有两种部署的应用程序。一个是他们托管所有东西,有一个应用程序/一个数据库,没有问题。第二个(这个问题将以中心为中心)将有一个应用程序,但每个客户端有不同的数据库连接。
每个域的访问权限都会列入白名单,因此我们不必担心一个客户端会弹出另一个客户端域,并且他们的身份是其他身份验证。
我需要的是双重的:
我想到的一个想法是使用apache根据请求的域设置env变量。但是,我更愿意将这种处理保留在laravel中。有什么想法吗?
答案 0 :(得分:1)
我们做这件事。如您所述,您需要一些权限,可以将域映射到客户端,然后远离以获取客户端特定的设置。
以下是我们如何设置它:
我们为每个客户端提供不同的Apache vhost,以及客户端已设置的所有域/别名。在vhost文件中,Apache为我们提供了一个单独的env变量CLIENT_ID
。这样我们就知道客户是谁,无论在任何时候使用哪个域别名。
我们有一个Laravel服务提供商,然后查看env('CLIENT_ID')
并设置了许多配置选项。设置的一个方面是特定于客户端的路径,我们在其中存储许多特定于客户端的资源和文件。所以我们正在做这样的事情:
Config::set("paths.client", "/var/www/clients/" . env("CLIENT_ID"));
现在我们已经设置了特定于客户端的路径,我们可以使用Dotenv
为该客户端加载特定于客户端的.env
文件。请注意,我们的app目录中仍然有一个根.env
文件(Laravel期望它),它设置了公共配置。特定于客户端的.env
文件设置客户端特定的内容,如SMTP设置,当然还有数据库连接设置。
Dotenv::load(Config::get("paths.client"));
现在加载了特定于客户端的.env
,我们可以轻松地写入database.connections
配置数组。从那以后,雄辩,其他一切正常。
Config::set('database.connections.mysql', [
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
]);
当然,你不必这样做。我们选择Apache vhosts作为将域映射到客户端的权限,但您可以拥有主数据库或仅配置文件。然后在您的服务提供者中,您只需要询问主数据库(或配置文件)需要设置哪些客户端。
如果您不想存储单独的.env
文件,那么您的客户端设置甚至可以位于主数据库或配置文件中。你可以通过很多方法给这只猫上皮。
最终,无论你到达那里,一旦你设置了数据库配置连接数组,你就可以了。
更新:
对于将来阅读此内容的任何人,还有另一种非常简单的方法来加载下面评论中提到的备用.env
文件:
如果在到达Laravel(虚拟主机等中的SetEnv)之前以某种方式设置APP_ENV,它将默认查找.env。 APP_ENV (例如:.env.demo)文件。我正在使用SetEnv设置APP_ENV,然后为每个客户端创建.env文件。
出于我们的目的,我们不希望客户端特定的.env
文件位于我们应用的根目录中。但它可以很好地适用于其他情况。