Files
lotteryLaravel/app/Console/Commands/LotteryDatabaseInitCommand.php

91 lines
2.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
final class LotteryDatabaseInitCommand extends Command
{
protected $signature = 'lottery:db-init
{--fresh : 先执行 migrate:fresh再初始化数据库}
{--demo : 额外写入演示数据(生产环境默认关闭)}
{--no-demo : 禁止写入演示数据}
{--skip-auth-sync : 跳过后台权限注册表同步}';
protected $description = '统一初始化数据库:迁移/基线、基础种子、后台权限同步,以及非生产演示数据';
public function handle(): int
{
$isProduction = app()->environment('production');
$seedDemo = $this->shouldSeedDemo($isProduction);
$migrationCommand = (bool) $this->option('fresh') ? 'migrate:fresh' : 'migrate';
$this->components->info(sprintf(
'开始数据库初始化:%s%s',
$migrationCommand,
$seedDemo ? ' + foundation seed + demo seed' : ' + foundation seed',
));
$migrateExit = $this->call($migrationCommand, [
'--force' => true,
]);
if ($migrateExit !== self::SUCCESS) {
return $migrateExit;
}
$foundationExit = $this->call('db:seed', [
'--class' => 'Database\\Seeders\\FoundationSeeder',
'--force' => true,
]);
if ($foundationExit !== self::SUCCESS) {
return $foundationExit;
}
if (! (bool) $this->option('skip-auth-sync')) {
$authExit = $this->call('lottery:admin-auth-sync', [
'--audit' => true,
]);
if ($authExit !== self::SUCCESS) {
return $authExit;
}
}
if ($seedDemo) {
if ($isProduction) {
$this->components->error('production 环境禁止写入演示数据。');
return self::FAILURE;
}
$demoExit = $this->call('db:seed', [
'--class' => 'Database\\Seeders\\LocalDemoSeeder',
'--force' => true,
]);
if ($demoExit !== self::SUCCESS) {
return $demoExit;
}
}
$this->newLine();
$this->components->info('数据库初始化完成。');
$this->line(sprintf('环境:%s', app()->environment()));
$this->line(sprintf('演示数据:%s', $seedDemo ? '已写入' : '未写入'));
$this->line('统一入口命令php artisan lottery:db-init');
return self::SUCCESS;
}
private function shouldSeedDemo(bool $isProduction): bool
{
if ((bool) $this->option('no-demo')) {
return false;
}
if ((bool) $this->option('demo')) {
return true;
}
return ! $isProduction;
}
}