我正在尝试为我的laravel 4项目设置2个环境,而我无法识别项目环境。
我在源代码中看到start.php使用的detectEnvironment是:
$args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null;
但是当我(打印)$ _SERVER ['argv']为空时(在实时服务器和本地机器上返回null)。
我需要设置一个人吗?
$env = $app->detectEnvironment(array(
'local' => array('*local*'),
'live' => array('*live*')
));
答案 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。