【问题标题】:Laravel 5 - Environment Detection by Server NameLaravel 5 - 按服务器名称检测环境
【发布时间】:2015-09-13 22:31:30
【问题描述】:

我了解 Laravel 5,它使用 .env 文件,因此我们可以设置特定的环境值。

我的问题是,Laravel 5 中有没有办法,例如,

if ($SERVER_NAME == "my_production_server") {
    $environment = "production"
}

因此它使用生产价值。我的想法是,我希望将所有环境及其变量放在一个文件或目录中,或者其他任何东西,这样我们就可以在没有任何人工干预的情况下部署整个构建,并且我们可以将这一切都签入我们的代码存储库。

【问题讨论】:

标签: php laravel-5 phpdotenv


【解决方案1】:

您可以将 .env 设置为:

APP_ENV=local
APP_DEBUG=true
APP_KEY=sjkanljksdnjsnetcetcetcetc..
APP_URL=http://localhost:8000

DB_HOST=qa
DB_DATABASE=admin
DB_USERNAME=home
DB_PASSWORD=root

DB_HOST2=production// I.P address
DB_DATABASE2=admin
DB_USERNAME2=admin
DB_PASSWORD2=admin

然后在 config 文件夹的 database.php 文件中,您可以设置连接 Host 和 Host2 以匹配 localhost 和生产值。

【讨论】:

    【解决方案2】:

    Laravel 5 比以前更难做到这一点,但这里是做这件事的方法。 在此之后,您需要做的就是更改 .env 文件的值,环境就会改变

    具体步骤如下

    1. 查看 Laravel 安装的本地 .env 并将其内容更改为 localproduction 或您需要的任何其他内容

    2. 创建2个文件.local.env.production.env

    3. 添加默认环境值:

      • .local.env : APP_ENV=local
      • .production.env : APP_ENV=production
    4. 新建一个php文件,命名为environment.php,保存到这个文件夹:app/bootstrap/environment.php

      $env = $app->detectEnvironment(function(){
        $environmentPath = __DIR__.'/../.env';
         $setEnv = trim(file_get_contents($environmentPath));
         if (file_exists($environmentPath)){
                putenv("APP_ENV=$setEnv");
                if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
                     Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
                } 
         }
      });
      
    5. 在引导文件中包含您的 environment.php 文件。将其粘贴到您的 bootstrap/app.php 文件中。

      require __DIR__.'/environment.php';
      

    耶!你完成了。

    注意:如果 Laravel 找不到 .env 文件,它会自动使用 .production.env,这使得它非常适合部署

    感谢http://developers.ph/laravel-framework/laravel-5/how-to-setup-multiple-environment-for-laravel-5-developers-way/

    【讨论】:

    • 这是伟大的卡尔。我唯一的问题是,它如何区分本地和生产?
    • :-) 认为这可能令人困惑。您在 .env 文件中指定它。只需添加单词local ,它将是本地生产或其他任何东西
    • 没关系,我看到您在 .env 文件中手动设置它。现在有办法动态设置它。您的第一部分非常有帮助....这也是我想看看它是否可能的地方。
    • 其实我可以在 enivornment.php 文件中编写代码。例如,如果 IP 地址为 1.2.3.4,则使用本地等。
    • 是的。就是这个方法。您可以使用 environment.php 替换 getenv('APP_ENV') 与您从 IP 设置的变量或任何您用来告诉本地生产的变量
    【解决方案3】:

    对于 Laravel 5.0,我有这样的。我遵循 cjds 指南,但更改了我的规范的代码。它不需要 .env 文件。

    $env = $app->detectEnvironment(function() {
        if (php_sapi_name() === 'cli') {
            if (strpos(getcwd(), 'production') !== false) {
                return 'production';
            } elseif (strpos(getcwd(), 'staging') !== false) {
                return 'staging';
            } elseif ((strpos(getcwd(), 'xampp') !== false) || (strpos(getcwd(), 'lampp') !== false)) {
                return 'development';
            } else {
                return 'production';
            }
        }
    
        $absoluteLink = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        if (strpos($absoluteLink, 'production') !== false) {
            return 'production';
        } elseif (strpos($absoluteLink, 'staging') !== false) {
            return 'staging';
        } elseif (strpos($absoluteLink, '.dev') !== false || strpos($absoluteLink, 'local') !== false || strpos($absoluteLink, '192.168') !== false) {
            return 'development';
        } else {
            return 'production';
        }
    });
    
    putenv("APP_ENV=" . $env);
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2011-09-26
      • 2015-11-12
      • 2014-03-10
      • 2017-06-19
      相关资源
      最近更新 更多