Swoft 2 框架概览
- 2019 年 10 月 4 日
- 筆記
最近在工作中使用到了一款swoole的衍生框架 Swoft ,虽然会有一些小毛病,但整体上还是不错的,安利一下,说不定就用上了呢?
文章结尾里面有重点噢!
简介:
Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。
环境要求:
- php 7.1 +
- composer
- swoole 4.3.4 +
安装:
composer create-project swoft/swoft swoft
使用:
在官方默认的配置中,以及在composer中增加了许多的组件,包括http-server,rpc-server,rpc-client,redis,views,db,websocket等很多组件,可以根据项目进行配置。
常用服务:
启动http server
php bin/swoft http:start //(start|restart|stop|reload)
启动rpc server
php bin/swoft rpc:start //(start|restart|stop|reload)
启动websocket server
php bin/swoft ws:start //(start|restart|stop|reload)
均支持 -d 参数以后台运行。
目录:
而且对于目录结构,也是以及为开发者定义好了功能目录,可以在开发中根据定义的功能目录直接存放代码文件,或者在其中定义业务相关的目录均可。配置上既有文档约定又具有一定的灵活性。
├── app/ ------ 应用代码目录 │ ├── Annotation/ ------- 定义注解相关 │ ├── Aspect/ ------- AOP 切面 │ ├── Bean/ ------- 一些具有独立功能的class bean │ ├── Console/ ------ 命令行代码目录 │ │ ├── Command/ │ ├── Exception/ ------ 定义异常类目录 │ │ └── Handler/ ------ 定义异常处理类目录 │ ├── Http/ ------ HTTP 代码目录 │ │ ├── Controller/ │ │ └── Middleware/ │ ├── Helper/ │ │ └── Functions.php │ ├── Listener/ ------ 事件监听器目录 │ ├── Model/ ------ 模型、逻辑等代码目录(这些层并不限定,根据需要使用) │ │ ├── Dao/ │ │ ├── Data/ │ │ ├── Logic/ │ │ └── Entity/ │ ├── Validator/ ------ 自定义校验器目录 │ ├── Rpc/ ------ RPC 代码目录 │ │ └── Service/ │ │ └── Middleware/ │ ├── WebSocket/ ------ WebSocket 代码目录 │ │ ├── Chat/ │ │ ├── Middleware/ │ │ └── ChatModule.php │ ├── Application.php -------- 应用类文件继承自swoft核心 │ ├── AutoLoader.php -------- 项目扫描等信息(应用本身也算是一个组件) │ └── bean.php -- bean配置文件 ├── bin/ │ ├── bootstrap.php │ └── swoft ------ swoft 入口文件 ├── config/ ------ 应用配置目录 │ ├── base.php --- 基础配置 │ ├── dev --- dev环境配置 │ │ ├── base.php -- dev环境基础配置 会覆盖外部配置 │ │ └── db.php -- dev环境db配置 │ └── db.php ├── public/ ------ WEB可访问目录 ├── resource/ ------ 应用相关资源目录 │ ├── language/ ------ 语言资源目录 │ └── view/ ------ 视图资源目录 ├── runtime/ ------ 临时文件目录(日志、上传文件、文件缓存等) ├── test/ ------ 单元测试代码目录 │ └── bootstrap.php ├── composer.json ├── composer.lock ├── phar.build.inc └── phpunit.xml.dist
注解:
注解的功能是我比较喜欢的,支持通过注解进行依赖注入,可以通过 @Bean() 默认创建全局单例,或者不同的参数@Bean(scope=Bean::PROTOTYPE) 定义原型(每次注入均克隆一份原型对象)等。
/** * 日期处理,这里定义了一个全局单例。 * @Bean() */ class DateHandler {} /** * 列表数据对象,这里定义了一个原型,因为列表数据不能共用,每个列表是不同的。 * @Bean(scope=Bean::PROTOTYPE) */ class ListData {}
使用的时候则通过注解 @Inject() 进行注入到使用的类中,如果不设置注入参数则默认引入@var定义的类实例对象。
class ShowController { /** * @Inject() * @var NamespaceDateHandler */ private $dateHandle; }
这些注解均利用反射实现,由于是常驻内存型的程序,所以在开启服务的过程中就完成了所有对象的实例化和注入,全部数据均加载到内存中,所以实际运行会非常快,运行中不再涉及反射等操作。
注解还包括http-server的控制器,异步或协程任务的执行方法,配置的注入等。
/** * @Config("list.style") */ private $listStyleConfig;
注解中值得注意的是,不能使用单引号,必须使用双引号。
Task:
任务处理器定义使用@Task(),任务入口方法使用@TaskMapping()。
/** * @Task(name="someTask") */ class SomeTask { /** * @TaskMapping() */ public function run(string $name) }
异步任务:
// Task::async(task_name, method, params); Task::async('someTask', 'run', ['hello world']);
协程任务:
// Task::co(task_name, method, params); Task::co('someTask', 'run', ['hello world']);
批量协程任务:
$tasks = [ [ 'someTask', 'run', ['hello world'] ] ]; Task::cos(array $tasks);
控制器:
控制器使用@Controller来定义,控制器方法使用@RequestMapping定义。
/** * @Controller("/") */ class OrderController { /** * @RequestMapping(route="index") * @Validate("order") */ public function index() {} }
注意:
swoft 2.0.5+ 验证器默认没有启动,需要开发者自己开启。需要开启校验器的http中间件,使用官方配置全局的http中间件并未起作用,只有在控制器中使用中间件注解才能起作用。
/** * * @Middlewares({ * @Middleware(ValidatorMiddleware::class) * }) * @Controller("/") * */ class SomeController {}
校验器中的属性校验配置注解 @NotEmpty() 不能单独使用,必须与变量类型判断注解一同使用,例如@IsString()、@IsArray()等。校验器中的属性校验配置注解 @Require() 不能使用。直接使用后均无法启动项目。
/** * 订单数据校验 * @Validator(name="order") */ class OrderValidator { /** * @IsInt("订单id类型不正确") * @NotEmpty("订单id不存在") */ protected $id; }
swoft自带redis开启配置时需要安装php的redis扩展。使用redis时可通过注入使用:
use SwoftRedisPool; /** * @Inject() * @var Pool */ private $redis;
完
