Yii 通过 web 入口执行 Migrate(非 console) [ 2.0 版本 ]
有时候,我们做了一个产品,想通过界面安装产品,因此,无法通过 console 执行
./yii migrate
,这种方式,我们需要通过 web 调用
因为 fecmall 有界面安装的需求,实现的代码如下:
public function runMigrate()
{
$bashPath = dirname(Yii::getAlias('@appfront'));
$oldApp = Yii::$app;
$aliases = Yii::$aliases;
Yii::$app = new \yii\console\Application([
'id' => 'install-console',
'basePath' => $bashPath,
'components' => [
'db' => $oldApp->db,
],
]);
ob_start();
ob_implicit_flush(false);
$runResult = Yii::$app->runAction('migrate/up', ['migrationPath' => '@fecshop/migrations/mysqldb', 'interactive' => false]);
$post_log = ob_get_clean();
Yii::info($post_log, 'fecshop_debug');
Yii::$app = $oldApp;
/**
* aliases 需要重新设置,否则,将会导致配置文件中的 aliases 无法获取,譬如main.php中的
* 'aliases' => [
* '@bower' => '@vendor/bower-asset',
* '@npm' => '@vendor/npm-asset',
* ],
*/
Yii::$aliases = $aliases;
// $runResult 返回值,0代表执行完成,1代表执行出错。
return $runResult === 0 ? true : false ;
}
fecmall原文地址:yii2 web 执行 migrate
Fecshop 深圳
注册时间:2016-01-21
最后登录:2024-08-13
在线时长:73小时36分
最后登录:2024-08-13
在线时长:73小时36分
- 粉丝157
- 金钱2381
- 威望490
- 积分8011
共 4 条评论
注意点:
代码
$runResult = Yii::$app->runAction('migrate/up', ['migrationPath' => '@fecshop/migrations/mysqldb', 'interactive' => false]);
返回值如果是
0
(int),那么代表执行成功,否则执行失败,这个有常规的方法相反对于代码:
Yii::$app->runAction
,因为是console的函数,在执行的过程中就会执行一些输出到STDOUT
,但是在web中输出这些内容就显的不合适,因此通过ob函数获取这些输出信息,然后写入到log文件里面ob_start(); ob_implicit_flush(false); $runResult = Yii::$app->runAction('migrate/up', ['migrationPath' => '@fecshop/migrations/mysqldb', 'interactive' => false]); $post_log = ob_get_clean(); Yii::info($post_log, 'fecshop_debug');
补充一下开头的语句:
有时候,我们做了一个产品,想通过界面安装产品,需要安装数据库sql,Yii2是通过console命令
./yii migrate
这种方式进行sql的安装和升级,如果用界面web安装无法使用,本文是通过界面进行migrate安装sql补充2:
// $runResult 返回值,0代表执行完成,1代表执行出错。 return $runResult === 0 ? true : false ;
上面的注释改一下,$runResult 返回值,0代表执行完成,其他的返回值代表执行出错。
补充3:fecmall部分安装代码实例:https://github.com/fecshop/yii2_fecshop/blob/master/app/appinstall/modules/Database/controllers/ConfigController.php#L259