Laravel 配置多环境env文件

项目需求不同,要求也不同,这个仅供参考,相互学习,共同进步

前提

主要实现方法是自己提供的useEnvironmentPath(),有兴趣的同学可以去研究下.
每个公司的要求不一样,有的习惯进行条件编译加载配置文件,有的不需要条件编译,怕安全泄露token等关键信息,手动修改配置信息.
像国内小公司基本不怎么分测试环境,正式环境,更没有减振环境,属于直接替换配置文件.所以呢进来看看学习学习.公司遇到过手动修改配置文件,正式上线后整个项目崩溃的情况.调查结果有个配置文件忘记写了.我觉得只要有人手动替换这种操作的,稍不注意就会出问题.
如果你很不细心,这个一定要时刻准备着,准备跑路.

一. 配置env文件夹

删除自带的.env等文件
添加env文件夹
并添加.dev.env, .stage.env, .prod.env文件
Laravel 配置多环境env文件

二. 修改app.php

Laravel 配置多环境env文件

//...
//...
//忽略上面代码
$app->singleton(
  Illuminate\Contracts\Debug\ExceptionHandler::class,
  App\Exceptions\Handler::class
);

/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/
//**********************代码添加到这块*******************************//
/**根据服务器的hostname,加载不同的.env文件
*获取主机名 
*这里方式可以根据自己需求修改 可以根据自己域名区分.
*我的这里根据服务器的hostname进行区分
*dev环境hostname:dev-projectname-api-web
*stage环境hostname:stage-projectname-api-web
*prod环境hostname:prod-projectname-api-web
*/

$hostname = gethostname();

//自定义env文件路径
$app->useEnvironmentPath(realpath(__DIR__.'/../env'));
$strProd = 'prod';
$strStage = 'stage';
$strDev = 'dev';
if (strpos($hostname, $strProd) !== false) {
  //prod环境
  $app->loadEnvironmentFrom('.prod.env');
} elseif (strpos($hostname, $strStage) !== false) {
  //stage环境
  $app->loadEnvironmentFrom('.stage.env');
} elseif (strpos($hostname, $strDev) !== false) {
  //dev环境
  $app->loadEnvironmentFrom('.dev.env');
} else {
  //其他情况,走dev分支
  $app->loadEnvironmentFrom('.dev.env');
}
//**********************代码添加到这块*******************************//
return $app;
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16

你这app.php文件是把原来的$app->singleton()调用也删掉了吗?

2年前 评论
Diudiuuuu (楼主) 2年前

我们是直接在部署的时候,运维在jenkins里替换.env.prod、.env.test为.env。 跟楼主的思想差不多,最终都是提交了各个环境的配置到git库中

2年前 评论

vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables.php::checkForSpecificEnvironmentFile

    protected function checkForSpecificEnvironmentFile($app)
    {
        if ($app->runningInConsole() && ($input = new ArgvInput)->hasParameterOption('--env')) {
            if ($this->setEnvironmentFilePath(
                $app, $app->environmentFile().'.'.$input->getParameterOption('--env')
            )) {
                return;
            }
        }

        $environment = Env::get('APP_ENV');

        if (! $environment) {
            return;
        }

        $this->setEnvironmentFilePath(
            $app, $app->environmentFile().'.'.$environment
        );
    }

看意思 laravel 应该是已经默认支持分情况加载 .env.development.env.production 这种格式的配置文件了

2年前 评论
Diudiuuuu (楼主) 2年前
游离不2 2年前
messikiller (作者) 2年前
游离不2

我们的做法是每个环境独立一个 env 文件,.env.dev.env.debug.env.online,部署的时候根据不同的环境执行 cp .env.xxx .env

2年前 评论
o扬帆远航x 1年前
aa24615

8.5以下版本本来就有了

2年前 评论

我多环境框架什么都没改,只修改了 FPM 在 www.conf 当中加入了 env[APP_ENV] = $APP_ENV 就完成了。好像是这样具体记不住了。

2年前 评论

我是通过nginx转发的时候指定APP_ENV环境变量的

2年前 评论

这个方法用了之后,在业务代码里env()就获取不到 博主env/.dev.env里的配置了

2年前 评论
Diudiuuuu (楼主) 2年前

这边文章很优雅的解决laravel 和lumen多.env文件的情况 medium.com/@yazeedobaid/laravel-lu...

1年前 评论
Diudiuuuu (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!