Laravel假设.env
文件应该描述环境,并且不应该将其提交给您的repo。
如果我想在我的repo中保留dev
和production
的.env
文件(比如.env-production
和.env-dev
(,并添加一些应该使用的自定义逻辑,例如基于当前域名,该怎么办。
类似的东西
if ($_SERVER['HTTP_HOST'] == 'prod.domain.com') {
load('.env-production');
} else {
load('.env-dev');
}
我怎样才能做到这一点?谢谢
Nadeem0035让我很清楚如何进行
return $app;
前的bootstrap'app.php
$envFile = $_SERVER['HTTP_HOST'] == 'prod.domain.com' ? '.env-production' : '.env-dev';
$app->loadEnvironmentFrom($envFile);
对自定义.env文件使用Dotenv::load((
laravel 5.1与vlucas/phpdotenv~1.0
if ($_SERVER['HTTP_HOST'] == 'prod.domain.com') {
Dotenv::load(__DIR__ . '/../','.production.env');
} else {
Dotenv::load(__DIR__ . '/../','.dev.env');
}
或
laravel 5.2与vlucas/phpdotenv~2.0
$dotenv = new Dotenv'Dotenv(__DIR__, 'myconfig'); // Laravel 5.2
$dotenv->load();
PHP dotenv
在bootstrap/app.php 中
我喜欢为那些为许多vhosts添加共享代码库的人添加一个解决方案,这些vhosts都需要不同的.env
文件来完成所有不同的事情,如数据库连接、smtp设置等。
对于每个vhost,在Apache上创建一个vhost-config:
<VirtualHost *:80>
ServerName your-vhost.yourdomain.com
DocumentRoot /var/www/shared-codebase/public
SetEnv VHOST_NAME 'your-vhost'
<Directory "/var/www/shared-codebase/public">
Options Indexes MultiViews FollowSymLinks
AllowOverride all
Order deny,allow
Require all granted
</Directory>
<IfModule mpm_itk_module>
AssignUserId your-vhost your-vhost
</IfModule>
ErrorLog /var/www/your-vhost/logs/error.log
CustomLog /var/www/your-vhost/logs/access.log combined
</VirtualHost>
所有vhosts都有相同的文档根和目录,因为它是一个共享的代码库。在配置中,我们添加了一个SetEnv VHOST_NAME 'your-vhost'
,稍后我们将在Laravel的bootstrap.php中使用它来更改vhost-specific .env
的位置。
接下来,在文件夹(fe./var/www/your vhost/.env(中创建自定义.env file
,即alter bootstrap.php
,以便从正确的位置加载.env。
<?php
$app = new Illuminate'Foundation'Application(
realpath(__DIR__.'/../')
);
$app->singleton(
Illuminate'Contracts'Http'Kernel::class,
App'Http'Kernel::class
);
$app->singleton(
Illuminate'Contracts'Console'Kernel::class,
App'Console'Kernel::class
);
$app->singleton(
Illuminate'Contracts'Debug'ExceptionHandler::class,
App'Exceptions'Handler::class
);
/*
|--------------------------------------------------------------------------
| Add the location of the custom env file
|--------------------------------------------------------------------------
*/
$app->useEnvironmentPath('/var/www/'.$_SERVER['VHOST_NAME']);
return $app;
仅此而已。
[edit]如果您希望以特定数据库为目标,或希望为特定.env生成密钥,则应将VHOST_NAME放在artisan命令前面。
VHOST_NAME=tenant2.domain.com php artisan key:generate
[edit]当在本地工作并使用Laravel Valet时,您可以在代码库的根目录中添加一个自定义.valet-env.php
。https://laravel.com/docs/master/valet#site-特定环境变量
您在laravel中有一个.env文件,您可以定义应用程序的级别。
APP_ENV=local
或
APP_ENV=production
您可以根据需要设置配置,而无需在此处创建新的.env文件。关于Laravel环境变量的更多信息:这里有更多的描述性帮助:phpdotenv
我在开发过程中也有类似的需求,我想在我的开发箱上做一些特别的"多租户",以针对多个数据库/配置测试相同的代码库。我不想要带有一堆if/then语句的意大利面条式代码,所以我提出了以下解决方案,它非常适合我的目的(不需要处理Apache、nginx或Caddy文件(:
在$app = new Illuminate'Foundation'Application(...);
行之后的bootstrap/app.php
中添加以下内容:
// First, check to see if there is a file named '.env'
// within a subdirectory named '.env.{{HOST_NAME}}
//
if (is_file($app->environmentPath().DIRECTORY_SEPARATOR. '.env.' . $_SERVER['HTTP_HOST'] .DIRECTORY_SEPARATOR. '.env')) {
// ...And if there is, use the directory as the new environment path
$app->useEnvironmentPath($app->environmentPath().DIRECTORY_SEPARATOR. '.env.'. $_SERVER['HTTP_HOST']);
}ER['HTTP_HOST']);
}
// Otherwise, just use the standard .env file as the default...
一旦包含了这一点,应用程序默认情况下仍将使用.env
(这意味着您仍然可以对任何不需要自定义的主机使用标准.env
文件(,但首先它会检查以主机名命名的子目录中是否存在备用.env
文件(即,如果主机名为"example.local.com",则该文件将位于名为.env.example.local.com
的子目录内(。
您可以更改代码,从目录名中删除有点多余的.env.
前缀,但我喜欢添加它,以使目录列表中的所有.env.*
条目保持在一起。
这种方法的一个好处是:通过在子目录中使用常用名称('.env'(,您应该只需要一个.env
条目,就可以确保所有自定义配置都不在git repo中。无需为每个自定义点环境文件添加新的.gitignore
条目
我想分享我的两分钱,用于在不同机器/主机上工作的团队。我在应用程序的根目录上创建了一个目录env
,其中包含:
- 具有主配置和共享配置的CCD_ 28文件
.name
文件,仅包含一个带有特定机器/用途的环境名称的字符串(例如"server1"(- 与上面定义的名称匹配的特定.env文件,例如
.server1.env
然后,在bootstrap/app.php中:
/**
* master config
*/
$app->useEnvironmentPath(__DIR__.'/../env');
$app->loadEnvironmentFrom('.master.env');
/**
* config overloading
*/
$app->afterLoadingEnvironment(function() use($app) {
$envFile = trim(file_get_contents($app->environmentPath().'/.name'));
if ($envFile && file_exists($app->environmentPath().'/.' .$envFile .'.env')) {
$dotenv = Dotenv'Dotenv::create($app->environmentPath(), '.'.$envFile.'.env');
$dotenv->overload();
}
});
现在,您可以选择性地覆盖特定机器的配置密钥,如果没有安全问题,您可以将env文件放在VCS中,只要您忽略".name"文件即可。
在Laravel 5.8中工作。