2014-02-05 41 views
1

我已经将我的laravel应用程序部署到弹性beanstalk环境中。这个程序检测周边环境与这段代码在引导/ start.phplaravel enviroment当命令行不同于浏览器时

$env = $app->detectEnvironment(function() { 
    return getenv('APP_ENV') ?: 'local'; 
}); 

当弹性魔豆开始运行,我已经设置了它的配置文件,如果参数设置为检测。在这种情况下,我有这个参数设置为开发和配置文件然后基于这个环境变量,即

APP_ENV = development 
DB_HOST = rds dev endpoint 
DB_NAME = rds dev db name 
DB_USERNAME = dev username 
DB_PASSWORD = devdb pass 

当我访问在按预期工作浏览器的应用程序,它被正确连接到开发D b。

当我ssh到服务器,并尝试运行

php artisan migrate 

我得到一个PDO异常

当我运行

php artisan env 

甚至返回本地虽然没有这样的文件或目录定义了环境变量APP_ENV。我非常确定这个变量是被定义的,因为当浏览器中的laravel错误时,我可以看到具有服务器/请求数据中的值开发的变量以及在环境启动时创建的其他环境变量

我是什么失踪?

编辑,包括基于ANTONIOS回答个性化的解决方案

.environment

<?php 
if (getenv('PARAM1') === false) { 
    return false; 
} else { 
    switch (getenv('PARAM1')) { 
     case 'development': 

      return array(
       'APP_ENV' => 'development', 

       'DB_HOST' => '***', 
       'DB_NAME' => '***', 
       'DB_USERNAME' => '***', 
       'DB_PASSWORD' => '***', 
       ); 
      break; 

     case 'staging': 

      return array(
       'APP_ENV' => 'staging', 

       'DB_HOST' => '***', 
       'DB_NAME' => '***', 
       'DB_USERNAME' => '***', 
       'DB_PASSWORD' => '***', 
       ); 
      break; 

     case 'production': 

      return array(
       'APP_ENV' => 'production', 

       'DB_HOST' => '***', 
       'DB_NAME' => '***', 
       'DB_USERNAME' => '***', 
       'DB_PASSWORD' => '***', 
       ); 
      break; 
    } 
} 

start.php

$env = require __DIR__.'/../.environment'; 

if ($env !== false) { 
    foreach ($env as $key => $value) { 
     putenv(sprintf('%s=%s', $key, $value)); 
    } 
} 

$env = $app->detectEnvironment(function() { 
    return getenv('APP_ENV') ?: 'local'; 
}); 
+0

好吧,但是,你得到你所有的变量你的git?我和你的情况完全一样 –

回答

3

当您运行

php artisan migrate 

PHP运行不同的用户下,而不是你的Web服务器,因此你需要:

php artisan migrate --env=development 

编辑

经与CLI和Web麻烦的原因之一,我不使用这些Web服务器ENV瓦尔。这是我做我的环境:

创建应用程序的根.environment文件并定义您的环境:

<?php 

return array(

    'APP_ENV' => 'development', 

    'POSTGRESQL.HOST' => 'localhost', 
    'POSTGRESQL.DATABASE_NAME' => 'laraveldatabase', 
    'POSTGRESQL.DATABASE_USER' => 'laraveluser', 
    'POSTGRESQL.DATABASE_PASSWORD' => '!Bassw0rT', 

); 

将它添加到您的应用程序.gitignore文件,这样你就不会冒险让你的密码发送到Github。

就在$app->detectEnvironment之前,加载。环境文件的PHP环境:

foreach(require __DIR__.'/../.environment' as $key => $value) 
{ 
    putenv(sprintf('%s=%s', $key, $value)); 
} 

然后你只需要使用它:

$env = $app->detectEnvironment(function() { 
    return getenv('APP_ENV'); 
}); 

它将工作无处不在:

<?php 

return array(

    'connections' => array(

     'postgresql' => array(
       'driver' => 'pgsql', 
       'host'  => getenv('POSTGRESQL.HOST'), 
       'database' => getenv('POSTGRESQL.DATABASE_NAME'), 
       'username' => getenv('POSTGRESQL.DATABASE_USER'), 
       'password' => getenv('POSTGRESQL.DATABASE_PASSWORD'), 
       'charset' => 'utf8', 
       'prefix' => '', 
       'schema' => 'public', 
     ), 

    ), 

); 

注意,我不做

return getenv('APP_ENV') ?: 'local'; 

因为我想要我t在我将应用程序部署到的每台服务器上都会失败。

+0

这很有道理,虽然我只是尝试过,但得到了同样的错误。因为它使用Web服务器以外的其他用户,它是否可以访问它需要的环境变量?我只是重读了我的aws支持案例,当时我得到了设置eniroment变量的方法,他说'还有一点值得注意的是,以这种方式设置的自定义环境变量将无法通过控制台进行修改。 “ – Ir1sh

+0

只是编辑,向你展示我的方式。 –

+0

谢谢当我有机会时,我会试试这个尝试 – Ir1sh