tp6实现自动生成swagger /components/schemas文件
一、思路
1、创建tp6命令行工具
2、读取数据库表结构
3、生成swagger schemas格式
4、保存文件到指定位置
二、自定义tp console
第一步,创建一个自定义命令类文件,运行指令
php think make:command Schema schema
会生成一个app\command\Schema
命令行指令类,我们修改内容如下:
<?php declare (strict_types=1); namespace app\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\input\Option; use think\console\Output; class Schema extends Command { protected function configure() { // 指令配置 $this->setName('schema') ->setDescription('the schema command'); } protected function execute(Input $input, Output $output) { // 指令输出 $output->writeln('schema'); } }
第二步,配置config/console.php
文件
<?php return [ 'commands' => [ 'hello' => 'app\command\Schema', ] ];
第三步,命令行运行schema
命令
php think schema
可以正常输出console文件输出的内容
三、编写生成schema代码
<?php declare (strict_types=1); namespace app\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\input\Option; use think\console\Output; use think\facade\Config; use think\facade\Db; class Schema extends Command { protected function configure() { // 指令配置 $this->setName('schema') ->setDescription('the schema command'); } protected function execute(Input $input, Output $output) { $tables = Db::query("SHOW TABLE STATUS"); foreach ($tables as $key => $table) { $fileds = Db::query("SHOW FULL COLUMNS FROM " . $table['Name']); $content = <<<END <?php /** * Class {$this->getDbName($table['Name'])} * 创建数据模型 * @OA\Schema( * title="{$this->getDbName($table['Name'])} model", * description="{$this->getDbName($table['Name'])} model", * ) */ class {$this->getDbName($table['Name'])} { END; $content .= PHP_EOL; foreach ($fileds as $item) { $content .= "\t/**" . PHP_EOL; $content .= "\t* ------" . PHP_EOL; $content .= "\t* @OA\Property(format=\"{$this->getFormat($item['Type'])}\",title=\"{$item['Comment']}\",default=\"{$item['Default']}\")" . PHP_EOL; $content .= "\t* @var {$this->getType($item['Type'])}" . PHP_EOL; $content .= "\t*/" . PHP_EOL; $content .= "\tprivate \${$item["Field"]};" . PHP_EOL; $content .= PHP_EOL; } $content .= "}"; file_put_contents(root_path() . "app/common/schema/" . $this->getDbName($table['Name']) . ".php", $content); } // 指令输出 $output->writeln('schema'); } private function getType($value) { $type = "string"; if (strpos($value, "int") !== false) { $type = "integer"; } elseif (strpos($value, "float") !== false || strpos($value, "double") !== false || strpos($value, "decimal") !== false) { $type = "number"; } return $type; } private function getFormat($value) { $format = "string"; if (strpos($value, "int") !== false) { $format = "int64"; } elseif (strpos($value, "float") !== false || strpos($value, "double") !== false || strpos($value, "decimal") !== false) { $format = "float"; } elseif (strpos($value, "date") !== false) { $format = "date"; } elseif (strpos($value, "datetime") !== false || strpos($value, "timestamp") !== false) { $format = "date-time "; } return $format; } private function getDbName($dbname) { $prefix = Config::get("database.connections.mysql.prefix"); $dbname = str_replace($prefix, "", $dbname); return str_replace(' ', '', ucwords(str_replace('_', ' ', $dbname))); } }
到此为止代码部分已全部完成。
四、参考资料
五、swagger生成文件使用
controller文件
<?php declare (strict_types=1); namespace app\restapi\controller; use app\common\controller\BaseController; use app\common\utils\Res; use app\user\model\UserSign; use think\Request; class User extends BaseController { /** * @OA\Get (path="/restapi/user/signList", * tags={"用户管理"}, * summary="签到列表", * @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string", default="123456")), * @OA\Parameter(name="user_id", in="query", description="user_id", @OA\Schema(type="int", default="")), * @OA\Response( * response="200", * description="成功状态", * @OA\JsonContent( * type="array", * @OA\Items(ref="#/components/schemas/UserSign") * ) * ) * ) */ public function signList(Request $request) { $list = UserSign::weekList($request); return Res::ok($list); } /** * @OA\Post (path="/restapi/user/signCreate", * tags={"用户管理"}, * summary="用户签到", * @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string", default="123456")), * @OA\RequestBody( * @OA\MediaType( * mediaType="application/x-www-form-urlencoded", * @OA\Schema( * type="object", * @OA\Property( * property="user_id", * description="user_id", * type="int", * ), * ) * ) * ), * @OA\Response( * response="200", * description="成功状态", * @OA\JsonContent( * type="array", * @OA\Items(ref="#/components/schemas/UserSign") * ) * ) * ) */ public function signCreate(Request $request) { $list = UserSign::createSave($request); if ($list === true) { return Res::ok($list); } return Res::error($list); } }
schema文件
<?php /** * Class UserSign * 创建数据模型 * @OA\Schema( * title="UserSign model", * description="UserSign model", * ) */ class UserSign { /** * ------ * @OA\Property(format="int64",title="签到id",default="") * @var integer */ private $sign_id; /** * ------ * @OA\Property(format="int64",title="会员id",default="") * @var integer */ private $user_id; /** * ------ * @OA\Property(format="string",title="交易号",default="") * @var string */ private $transaction_id; /** * ------ * @OA\Property(format="int64",title="积分",default="") * @var integer */ private $grade; /** * ------ * @OA\Property(format="int64",title="连续签到记录数",default="") * @var integer */ private $succ_record; /** * ------ * @OA\Property(format="int64",title="创建时间",default="") * @var integer */ private $created_at; }