Artisan 应用版本脚本升级命令
应用版本脚本升级的意义
升级命令的意义在于,应用升级迭代的时候时,
- 需要对数据库的内容进行检查是否符合下个版本的使用,防止应用由于更新了版本 导致某个功能不可用或者异常。
- 由于之前的bug 导致了脏数据填入 换新功能 等数据库需要变动 预填充数据等 的任何操作。
人为去操作数据库是 很危险的,无论你涉及的数据重要性或多少
所以应该增加对升级版本的支持。该命令也需要有相对应的回滚,保证少数情况下异常升级导致的问题。
该命令 可以在使用docker等自动部署应用的时候 让系统自动为你执行(推荐)或者 每次升级的时候 手动执行
以下我列举一个简单的 例子 如果版本迭代众多 可以拆分到其余的子命令 也可以按照某个升级脚本中的某个模块来操作,自由发挥。
<?php
namespace App\Console\Commands\Upgrade;
use App\Models\Option;
use App\Models\Users\UserItems;
use Illuminate\Console\Command;
use Cache;
use Illuminate\Support\Facades\DB;
class UpgradeCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'upgrade {version?} {--rollback}';
/**
* The console command description.
*
* @var string
*/
protected $description = '升级应用版本';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$version = $this->argument('version');
$rollback = $this->option('rollback'); //需要备份到文件并回滚
$message = '您的命令有误,目前支持v1.1.0 命令应如:php artisan upgrade v1.1.0 ';
//判断当前版本,如果当前版本匹配则执行操作
if ($version == 'v1.1.0' && !$rollback) {
$message = '本次升级了以下内容:1.删除user_items表内的chat_name数据 ';
$this->output->progressStart(1);
// $this->output->progressAdvance();
//删除user_items表内的chat_name数据
$userItems=UserItems::query()->get();
try {
DB::beginTransaction();
foreach ($userItems as $userItem) {
Option::set('upgrade_1.0.0_user_items_id_'.$userItem->id, $userItem->chat_name); //备份旧数据
$userItem->chat_name=null;
$userItem->save();
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
$this->output->error('升级脚本遇到了问题 并全部回滚');
return ;
}
$this->output->progressFinish();
}
if ($version == 'v1.1.0' && $rollback) {
$message = '还原user_items表内的chat_name数据';
$this->output->progressStart(1);
//还原user_items表内的chat_name数据
$userItems=UserItems::query()->get();
foreach ($userItems as $userItem) {
if (Option::get('upgrade_1.0.0_user_items_id_'.$userItem->id)) {
$userItem->chat_name= Option::get('upgrade_1.0.0_user_items_id_'.$userItem->id);
Option::where('key', Option::get('upgrade_1.0.0_user_items_id_'.$userItem->id))->delete();
$userItem->save();
}
}
$this->output->progressFinish();
}
$this->output->info($message);
}
}