我正在构建一个需要创建新数据库,通过网页执行迁移和种子数据库数据的应用程序。
我正在尝试使用Laravel 4.2中的以下代码实现此目的。注意,这是在我设置的控制器内。
Artisan::call("migrate", array(
"--env" => "production"
));
无论我使用“--env”选项传递什么环境,运行迁移的环境都是网站当前运行的当前环境。 IE浏览器。如果我在我的本地环境中运行,并运行上述环境,它将在本地环境中执行迁移,这不是我想要做的。
如果我从命令行运行等效命令php artisan --env=production migrate
,我会得到我想要实现的结果。目前,我已经通过passthru()
过去了,但如果可以的话,我想利用这个Artisan门面。
有谁知道这是怎么回事?
答案 0 :(得分:1)
--env
是在应用程序启动时指定应用程序环境的选项。换句话说,如果指定--env
选项,Laravel将使用您指定的环境,而不是在环境检测方法中运行检测方法。
因此,如果您通过CLI使用artisan
选项运行--env
,则在启动文件中,artisan
可以从--env
变量中检测$_SERVER
选项,指定应用程序环境并运行您的命令。
相反,当您调用Artisan::call()
时,Laravel将解析控制台应用程序类(Illuminate\Console\Application
)并运行您的命令。因为您的应用程序已启动,所以Application
只运行您的命令而不检测环境。此外,latest version of migration
command class使用应用程序环境来获取数据库连接
因此,当您的电话Artisan::call()
完全省略--env
选项时。
只是我的意见。如果您确实想避免使用passthru()
功能,可以将app/config/database.php
中的生产数据库连接名称重命名为唯一名称,例如production
并将您的默认数据库连接设置为新名称。如果要迁移生产数据库,只需调用Artisan::call('migrate', array('--database' => 'production', '--force' => true))
而不是更改环境。
答案 1 :(得分:1)
这不是一种愉快的方式,但它确实有效。
假设您的Artisan环境基于$_SERVER['HTTP_HOST']
并且您知道将加载环境的HTTP_HOST,那么您可以在调用start.php之前手动设置它。
我用它根据我在Behat个人资料中使用的base_url来定义Artisan环境。这样我就可以在运行测试之前配置我的数据库。
/**
* @BeforeSuite
*/
public static function runFixtures(SuiteEvent $suiteEvent) {
// Get the environment domain
$parameters = $suiteEvent->getContextParameters();
$baseUrl = $parameters['base_url'];
$urlParts = parse_url($baseUrl);
$_SERVER['HTTP_HOST'] = $urlParts['host'];
// Now call start.php
require_once 'bootstrap/start.php';
// Call Artisan
$stream = fopen('php://output', 'w');
Artisan::call(
'migrate:refresh',
[
'--seed' => true,
],
new StreamOutput($stream)
);
}