有时候,我们做了一个产品,想通过界面安装产品,因此,无法通过console执行 ./yii migrate,这种方式,我们需要通过web调用
有时候,我们做了一个产品,想通过界面安装产品,需要安装数据库sql,Yii2是通过console命令 ./yii migrate
这种方式进行sql的安装和升级,如果用界面web安装无法使用,本文是通过界面进行migrate
安装sql
因为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 代表执行完成,其他的返回值代表执行出错(这个地方和常规函数相反)
return $runResult === 0 ? true : false ;
}
fecmall部分安装代码实例:https://github.com/fecshop/yii2_fecshop/blob/master/app/appinstall/modules/Database/controllers/ConfigController.php#L259