代码生成
在根目录下创建 auto.php 文件
include "./vendor/autoload.php";
\EasySwoole\EasySwoole\Core::getInstance()->initialize()->globalInitialize();
// var_dump(\EasySwoole\EasySwoole\Config::getInstance()->getConf('MYSQL'));die;
go(function () {
//生成基础类
$generation = new \EasySwoole\CodeGeneration\InitBaseClass\Controller\ControllerGeneration();
$generation->generate();
$generation = new \EasySwoole\CodeGeneration\InitBaseClass\UnitTest\UnitTestGeneration();
$generation->generate();
$generation = new \EasySwoole\CodeGeneration\InitBaseClass\Model\ModelGeneration();
$generation->generate();
//加载数据配置
$mysqlConfig = new \EasySwoole\ORM\Db\Config(\EasySwoole\EasySwoole\Config::getInstance()->getConf('MYSQL'));
//获取连接
$connection = new \EasySwoole\ORM\Db\Connection($mysqlConfig);
//表名
$tableName = 'user';
$codeGeneration = new EasySwoole\CodeGeneration\CodeGeneration($tableName, $connection);
//生成model
$codeGeneration->generationModel("\\User");
//生成controller
$codeGeneration->generationController("\\Api\\User", null);
//生成unitTest
$codeGeneration->generationUnitTest("\\User", null);
// 命令行执行后是root用户组,要改成www用户组
// chown -fR www ./*
// chgrp -fR www ./*
});
命令行执行
php auto.php
执行成功后就会在 生成 控制器: App/HttpController/Api/User/User.php 、 模型:App/Model/User/UserModel.php、单元测试:UnitTest/User/UserTest.php
控制器默认生成的控制器是api接口,控制器上有默认注解,详细使用可以到官网查看
注:代码生成的控制器 是基础注解文档的控制器,如果报错的话就用基础控制器类
// use EasySwoole\HttpAnnotation\AnnotationController;
use EasySwoole\Http\AbstractInterface\Controller;
控制器
url解析规则
仅支持
PATHINFO
模式的 URL 解析,且与控制器名称(方法)保持一致,控制器搜索规则为优先完整匹配模式在没有路由干预的情况下,内置的解析规则支持无限级嵌套目录
例子:http://serverName/api/auth/login 的 对应执行的方法为 \App\HttpController\Api\Auth::login()
逻辑:
如果 f 为控制器名,则执行的方法为 \App\HttpController\A\B\C\D\F::index()
如果 f 为方法名,则执行的方法为 \App\HttpControllers\A\B\C\D::f()
如果最后的路径为
index
时,底层会自动忽略,并直接调用控制器的默认方法(也就是index)
注意,EasySwoole的URL路径区分大小写,控制器首字母支持小写转换
控制器代码例子看文章的 使用视图:
模型/数据库操作
数据库启用:
数据库连接配置:
return [
'SERVER_NAME' => "EasySwoole",
'MAIN_SERVER' => [
'LISTEN_ADDRESS' => '0.0.0.0',
'PORT' => 9601,
'SERVER_TYPE' => EASYSWOOLE_WEB_SERVER, //可选为 EASYSWOOLE_SERVER EASYSWOOLE_WEB_SERVER EASYSWOOLE_WEB_SOCKET_SERVER,EASYSWOOLE_REDIS_SERVER
'SOCK_TYPE' => SWOOLE_TCP,
'RUN_MODEL' => SWOOLE_PROCESS,
'SETTING' => [
'worker_num' => 8,
'reload_async' => true,
'max_wait_time'=>3
],
'TASK'=>[
'workerNum'=>4,
'maxRunningNum'=>128,
'timeout'=>15
],
],
'TEMP_DIR' => null,
'LOG_DIR' => null,
'MYSQL' => [
'host' => '127.0.0.1',
'database' => '',
'port' => 3306,
'user' => '',
'password' => '',
'charset' => 'utf8',
],
];
线程加载:
use EasySwoole\ORM\DbManager;
use EasySwoole\ORM\Db\Connection;
use EasySwoole\ORM\Db\Config;
use EasySwoole\EasySwoole\Config as GlobalConfig;
class EasySwooleEvent implements Event
{
public static function initialize()
{
// TODO: Implement initialize() method.
date_default_timezone_set('Asia/Shanghai');
// mysql 初始化
$config = new Config(GlobalConfig::getInstance()->getConf("MYSQL"));
//连接池配置
$config->setGetObjectTimeout(3.0); //设置获取连接池对象超时时间
$config->setIntervalCheckTime(30*1000); //设置检测连接存活执行回收和创建的周期
$config->setMaxIdleTime(15); //连接池对象最大闲置时间(秒)
$config->setMaxObjectNum(20); //设置最大连接池存在连接对象数量
$config->setMinObjectNum(5); //设置最小连接池存在连接对象数量
$config->setAutoPing(5); //设置自动ping客户端链接的间隔
DbManager::getInstance()->addConnection(new Connection($config));
}
public static function mainServerCreate(EventRegister $register)
{
// 文件热加载[dev]
// 配置同上别忘了添加要检视的目录
$hotReloadOptions = new \EasySwoole\HotReload\HotReloadOptions;
$hotReload = new \EasySwoole\HotReload\HotReload($hotReloadOptions);
$hotReloadOptions->setMonitorFolder([EASYSWOOLE_ROOT . '/App']);
$server = ServerManager::getInstance()->getSwooleServer();
$hotReload->attachToServer($server);
// mysql
$register->add($register::onWorkerStart,function (){
//链接预热
DbManager::getInstance()->getConnection()->getClientPool()->keepMin();
});
}
}
模型代码:
class UserModel extends AbstractModel
{
//设置表名
protected $tableName = 'user';
//查询获取分页列表
public function getList(int $page = 1, int $pageSize = 10, string $field = '*'): array
{
$list = $this
->withTotalCount()
->order($this->schemaInfo()->getPkFiledName(), 'DESC')
->field($field)
->page($page, $pageSize)
->all();
$total = $this->lastQueryResult()->getTotalCount();;
return ['total' => $total, 'list' => $list];
}
}
视图
这里我使用的是thinkPHP的视图
使用前准备:
安装thinkPHP的视图
composer require topthink/think-template
创建视图基础类:App/Base/ViewController.php
<?php /* * @Author: HappyCrab * @Date: 2020-11-06 14:01:29 * @LastEditors: HappyCrab * @LastEditTime: 2020-11-06 17:35:19 * @Description: */ namespace App\Base; use EasySwoole\Http\AbstractInterface\Controller; use EasySwoole\EasySwoole\Config; use think\Template; /** * 视图控制器 * Class ViewController * @author : evalor <master@evalor.cn> * @package App */ abstract class ViewController extends Controller { private $view; /** * 初始化模板引擎 * ViewController constructor. * @param string $actionName * @param Request $request * @param Response $response */ public function __construct() { $this->init(); parent::__construct(); } /** * 输出模板到页面 * @param string|null $template 模板文件 * @param array $vars 模板变量值 * @param array $config 额外的渲染配置 * @author : evalor <master@evalor.cn> */ public function fetch($template=null, $vars = [], $config = []) { ob_start(); $template==null&&$template=$GLOBALS['base']['ACTION_NAME']; $this->view->fetch($template, $vars, $config); $content = ob_get_clean(); $this->response()->write($content); } /** * @return Template */ public function getView(): Template { return $this->view; } // 初始化 public function init() { $this->view = new Template(); $tempPath = Config::getInstance()->getConf('TEMP_DIR'); # 临时文件目录 $class_name_array = explode('\\', static::class); $class_name_array_count = count($class_name_array); $controller_path = $class_name_array[$class_name_array_count - 2] . DIRECTORY_SEPARATOR . $class_name_array[$class_name_array_count - 1] . DIRECTORY_SEPARATOR; $this->view->config([ 'view_path' => EASYSWOOLE_ROOT . DIRECTORY_SEPARATOR . 'App' . DIRECTORY_SEPARATOR . 'Views' . DIRECTORY_SEPARATOR . $controller_path, # 模板文件目录 'cache_path' => "{$tempPath}/templates_c/", # 模板编译目录 ]); } }
使用视图:
创建控制器:App/HttpController/Home/User.php
namespace App\HttpController\Home;
use App\Base\ViewController;
class User extends ViewController
{
public function index()
{
$assign = array(
'test'=>1,
);
// 设置模板参数
$this->getView()->assign($assign);
// 输出页面
$this->fetch('task');
}
}
创建视图模板:App/Views/Home/User/index.html
<code>视图测试:{$test}</code>