Laravel假定.env
文件应描述环境,不应将其提交给您的回购。
如果我想在我的仓库中保留.env
和dev
(例如production
和.env-production
)的.env-dev
个文件,并添加一些自定义逻辑,该怎么办?应该使用哪个文件,例如基于当前域名。
像
这样的东西if ($_SERVER['HTTP_HOST'] == 'prod.domain.com') {
load('.env-production');
} else {
load('.env-dev');
}
我怎样才能实现它? 谢谢!
答案 0 :(得分:6)
将Dotenv :: load()用于自定义.env文件
laravel 5.1 with vlucas / phpdotenv~1.0
if ($_SERVER['HTTP_HOST'] == 'prod.domain.com') {
Dotenv::load(__DIR__ . '/../','.production.env');
} else {
Dotenv::load(__DIR__ . '/../','.dev.env');
}
OR
laravel 5.2 with vlucas / phpdotenv~2.0
$dotenv = new Dotenv\Dotenv(__DIR__, 'myconfig'); // Laravel 5.2
$dotenv->load();
在bootstrap / app.php中
答案 1 :(得分:5)
Nadeem0035 让我非常清楚该怎么做
在bootstrap\app.php
之前 return $app;
$envFile = $_SERVER['HTTP_HOST'] == 'prod.domain.com' ? '.env-production' : '.env-dev';
$app->loadEnvironmentFrom($envFile);
答案 2 :(得分:1)
您已将.env文件单独放入laravel,您可以定义应用级别。
APP_ENV=local
要么
APP_ENV=production
您可以根据需要设置配置,而不需要在此处创建新的.env文件。有关Laravel Environment Variables的更多信息:
以下是对您的更具描述性的帮助:phpdotenv
答案 3 :(得分:0)
我想为拥有许多虚拟主机共享代码库的人添加解决方案,这些人都需要使用不同的.env
文件来处理所有不同的事物,例如数据库连接,smtp设置等。
对于Apache上的每个 vhost ,创建一个vhost配置:
<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>
所有虚拟主机具有相同的文档根目录和目录,因为它是共享的代码库。在配置内部,我们添加了SetEnv VHOST_NAME 'your-vhost'
,稍后将在Laravel的bootstrap.php中使用它来更改特定于虚拟主机的.env
的位置。
接下来,在文件夹{fe。/var/www/your-vhost/.env)的另一个.env file
中创建自定义bootstrap.php
,以便从正确的位置加载.env。 / p>
<?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;
仅此而已。
答案 4 :(得分:0)
对于在不同机器/主机上工作的团队,我想分享我的两分钱。
我在应用程序的根目录上创建了一个目录env
,其中包含:
.master.env
文件。 .name
文件,仅包含具有特定计算机/用途的环境名称的字符串(例如“ server1”).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中工作。
答案 5 :(得分:0)
我在开发过程中有类似的要求,并且想在我的开发箱中做一些临时的“多租户”来针对多个数据库/配置测试相同的代码库。我不想要带有一堆if / then语句的意大利面条代码,所以我想出了以下解决方案,该解决方案非常适合我的目的(并且不需要对Apache,nginx或Caddy文件进行任何处理):< / p>
在bootstrap/app.php
行之后的$app = new Illuminate\Foundation\Application(...);
中添加以下内容:
// 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”,则该文件将位于名为{{ 1}})。
您可以更改代码以从目录名称中删除有些多余的.env.example.local.com
前缀,但是我想添加它以将所有.env.
条目保留在目录列表中。
这种方法的一个好处:通过使用子目录中的普通名称('.env') ,您只需输入一个.env.*
就可以确保全部,您的自定义配置不会进入git存储库。无需为每个自定义的dot-env文件添加新的.env
条目。