Fecshop 2019-09-12 12:50:35 5841次浏览 4条评论 2 1 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

觉得很赞
  • 评论于 2019-09-12 12:55 举报

    注意点:

    1. 代码$runResult = Yii::$app->runAction('migrate/up', ['migrationPath' => '@fecshop/migrations/mysqldb', 'interactive' => false]);
      返回值如果是0(int),那么代表执行成功,否则执行失败,这个有常规的方法相反

    2. 对于代码: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');
    
  • 评论于 2019-09-12 18:19 举报

    补充一下开头的语句:

    有时候,我们做了一个产品,想通过界面安装产品,需要安装数据库sql,Yii2是通过console命令 ./yii migrate这种方式进行sql的安装和升级,如果用界面web安装无法使用,本文是通过界面进行migrate安装sql

  • 评论于 2019-09-12 18:21 举报

    补充2:

    // $runResult 返回值,0代表执行完成,1代表执行出错。
    return $runResult === 0 ? true : false ;
    

    上面的注释改一下,$runResult 返回值,0代表执行完成,其他的返回值代表执行出错。

    觉得很赞
您需要登录后才可以评论。登录 | 立即注册