前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swoft 2 框架概览

Swoft 2 框架概览

作者头像
江湖安得便相忘
发布2019-09-16 17:50:39
1K0
发布2019-09-16 17:50:39
举报

最近在工作中使用到了一款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 \Namespace\DateHandler
     */
    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 Swoft\Redis\Pool;

/**
 * @Inject()
 * @var Pool
 */
private $redis;

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可回收BUG 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档