laravel 4 - detectEnvironment dosen工作

时间:2014-03-26 21:28:48

标签: php laravel laravel-4

我正在尝试为我的laravel 4项目设置2个环境,而我无法识别项目环境。

我在源代码中看到start.php使用的detectEnvironment是:

    $args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null;

但是当我(打印)$ _SERVER ['argv']为空时(在实时服务器和本地机器上返回null)。

我需要设置一个人吗?

  • 请记住,我的实时服务器是共享主机,我对配置的访问权限有限。
  • 我在/ config /中使用database.php打开了dir并在start.php中设置了所有内容:

$env = $app->detectEnvironment(array(

    'local' => array('*local*'),

    'live' => array('*live*')

));

2 个答案:

答案 0 :(得分:4)

这就是我设置环境的方式:

在应用程序的根目录中创建一个.environment文件,并定义您的环境并将敏感信息添加到其中:

<?php

return array(

     'APPLICATION_ENV' => 'development', /// this is where you will set your environment

     'DB_HOST' => 'localhost',
     'DB_DATABASE_NAME' => 'laraveldatabase',
     'DB_DATABASE_USER' => 'laraveluser',
     'DB_DATABASE_PASSWORD' => '!Bassw0rT',

);

将其添加到您的.gitignore文件中,这样您就不会有将密码发送到Github或任何其他服务器的风险。

$app->detectEnvironment之前,在文件bootstrap/start.php中,将您的.environment文件加载到PHP环境中:

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

然后你必须使用它:

$env = $app->detectEnvironment(function () {

    return getenv('APPLICATION_ENV'); // your environment name is in that file!

});

它可以在任何地方使用,因此您不再需要为开发和生产分别设置目录:

<?php

return array(

    'connections' => array(

         'postgresql' => array(
              'driver'   => 'pgsql',
              'host'     => getenv('DB_HOST'),
              'database' => getenv('DB_DATABASE_NAME'),
              'username' => getenv('DB_DATABASE_USER'),
              'password' => getenv('DB_DATABASE_PASSWORD'),
              'charset'  => 'utf8',
              'prefix'   => '',
              'schema'   => 'public',
         ),

    ),

);

请注意,我没有设置后备:

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

因为,如果我没有在我部署应用的每台服务器上设置文件我希望它失败

Laravel利用类似的东西,在应用程序的根目录中创建.env文件:

.env.local.php    // this file will appear only in your local environment, not in production
.env.staging.php  // for staging
.env.php          // for production

在这些文件中添加敏感信息

<?php

return array(

    'DB_HOST' => 'localhost',
    'DB_USER' => 'root',
    'DB_PASS' => '1023809182root@pass',

);

创建由环境分隔的文件:

应用程序/配置/本地/ database.php中    应用程序/配置/分段/ database.php中    应用程序/配置/ database.php中

然后在您的文件或应用程序的任何位置,您可以通过$ _ENV或getenv()访问您的敏感数据:

$_ENV['DB_HOST']
$_ENV['DB_USER']
$_ENV['DB_PASS']

示例:

'postgresql' => [
    'driver'   => 'pgsql',
    'host'     => 'localhost',
    'database' => getenv('DB_HOST'),
    'username' => getenv('DB_USER'),
    'password' => getenv('DB_PASS'),
    'charset'  => 'utf8',
    'prefix'   => '',
    'schema'   => 'public',
],

但是你仍然需要设置环境名称,这可能是你的问题。

不要忘记将这些文件添加到您的.gitignore文件中,这样您就不会冒险将它们发送到您的github。

文档:http://laravel.com/docs/configuration#protecting-sensitive-configuration

答案 1 :(得分:3)

实际上$args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null;只有在从命令行运行时传递给脚本的参数才有效。因此,在Laravel中,如果运行任何artisan命令,那么传递给该命令的所有参数都将在$_SERVER['argv']中可用,否则它将始终为NULL。< / p>

要检查环境,您可以使用App::environment()方法或App::isLocal()方法检查当地情况并设置您可能使用的不同环境:

$env = $app->detectEnvironment(array(
    // replace with your machine/host name, gethostname() will return hostname
    'local' => array('your-machine-name')
));

或者您可以使用以下内容:

$env = $app->detectEnvironment(function(){
    // SheikhHeera-PC is my machine name
    return $_SERVER['HTTP_HOST'] == 'SheikhHeera-PC' ? 'local':'production';
});

详细了解documentation