$input
$input : \think\console\Input
$input : \think\console\Input
$output : \think\console\Output
$console : \think\Console
setConsole(\think\Console $console = null)
设置控制台
\think\Console | $console |
getConsole() : \think\Console
获取控制台
run(\think\console\Input $input, \think\console\Output $output) : integer
执行
\think\console\Input | $input | |
\think\console\Output | $output |
setCode(callable $code) : \think\console\Command
设置执行代码
callable | $code | callable(InputInterface $input, OutputInterface $output) |
setDefinition(array|\think\console\input\Definition $definition) : \think\console\Command
设置参数定义
array|\think\console\input\Definition | $definition |
getDefinition() : \think\console\input\Definition
获取参数定义
getNativeDefinition() : \think\console\input\Definition
获取当前指令的参数定义
addArgument(string $name, integer $mode = null, string $description = '', mixed $default = null) : \think\console\Command
添加参数
string | $name | 名称 |
integer | $mode | 类型 |
string | $description | 描述 |
mixed | $default | 默认值 |
addOption(string $name, string $shortcut = null, integer $mode = null, string $description = '', mixed $default = null) : \think\console\Command
添加选项
string | $name | 选项名称 |
string | $shortcut | 别名 |
integer | $mode | 类型 |
string | $description | 描述 |
mixed | $default | 默认值 |
setName(string $name) : \think\console\Command
设置指令名称
string | $name |
setDescription(string $description) : \think\console\Command
设置描述
string | $description |
setHelp(string $help) : \think\console\Command
设置帮助信息
string | $help |
setAliases(array<mixed,string> $aliases) : \think\console\Command
设置别名
array<mixed,string> | $aliases |
execute(\think\console\Input $input, \think\console\Output $output) : null|integer
执行指令
\think\console\Input | $input | |
\think\console\Output | $output |
interact(\think\console\Input $input, \think\console\Output $output)
用户验证
\think\console\Input | $input | |
\think\console\Output | $output |
initialize(\think\console\Input $input, \think\console\Output $output)
初始化
\think\console\Input | $input | An InputInterface instance |
\think\console\Output | $output | An OutputInterface instance |
<?php
namespace app\admin\command;
use PDO;
use think\Config;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use think\Db;
use think\Exception;
class Install extends Command
{
protected $model = null;
protected function configure()
{
$config = Config::get('database');
$this
->setName('install')
->addOption('hostname', 'a', Option::VALUE_OPTIONAL, 'mysql hostname', $config['hostname'])
->addOption('hostport', 'o', Option::VALUE_OPTIONAL, 'mysql hostport', $config['hostport'])
->addOption('database', 'd', Option::VALUE_OPTIONAL, 'mysql database', $config['database'])
->addOption('prefix', 'r', Option::VALUE_OPTIONAL, 'table prefix', $config['prefix'])
->addOption('username', 'u', Option::VALUE_OPTIONAL, 'mysql username', $config['username'])
->addOption('password', 'p', Option::VALUE_OPTIONAL, 'mysql password', $config['password'])
->addOption('force', 'f', Option::VALUE_OPTIONAL, 'force override', FALSE)
->setDescription('New installation of FastAdmin');
}
protected function execute(Input $input, Output $output)
{
// 覆盖安装
$force = $input->getOption('force');
$hostname = $input->getOption('hostname');
$hostport = $input->getOption('hostport');
$database = $input->getOption('database');
$prefix = $input->getOption('prefix');
$username = $input->getOption('username');
$password = $input->getOption('password');
$installLockFile = __DIR__ . "/Install/install.lock";
if (is_file($installLockFile) && !$force) {
throw new Exception("\nFastAdmin already installed!\nIf you need to reinstall again, use the parameter --force=true ");
}
$sql = file_get_contents(__DIR__ . '/Install/fastadmin.sql');
$sql = str_replace("`fa_", "`{$prefix}", $sql);
// 先尝试能否自动创建数据库
$config = Config::get('database');
$pdo = new PDO("{$config['type']}:host={$hostname}" . ($hostport ? ";port={$hostport}" : ''), $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query("CREATE DATABASE IF NOT EXISTS `{$database}` CHARACTER SET utf8 COLLATE utf8_general_ci;");
// 连接install命令中指定的数据库
$instance = Db::connect([
'type' => "{$config['type']}",
'hostname' => "{$hostname}",
'hostport' => "{$hostport}",
'database' => "{$database}",
'username' => "{$username}",
'password' => "{$password}",
]);
// 查询一次SQL,判断连接是否正常
$instance->execute("SELECT 1");
// 调用原生PDO对象进行批量查询
$instance->getPdo()->exec($sql);
file_put_contents($installLockFile, 1);
$dbConfigFile = APP_PATH . 'database.php';
$config = @file_get_contents($dbConfigFile);
$callback = function ($matches) use ($hostname, $hostport, $username, $password, $database, $prefix) {
$field = $matches[1];
$replace = $$field;
if ($matches[1] == 'hostport' && $hostport == 3306) {
$replace = '';
}
return "'{$matches[1]}'{$matches[2]}=>{$matches[3]}Env::get('database.{$matches[1]}', '{$replace}'),";
};
$config = preg_replace_callback("/'(hostname|database|username|password|hostport|prefix)'(\s+)=>(\s+)Env::get\((.*)\)\,/", $callback, $config);
// 写入数据库配置
file_put_contents($dbConfigFile, $config);
\think\Cache::rm('__menu__');
$output->info("Install Successed!");
}
}