Swoft2.x 小白学习笔记 (一) ---控制器
Swoft通过官方文档进行学习,这里不做介绍,直接上手。
涉及到Swoft方面:(配置、注意的坑)
1、控制器(路由、验证器、中间件)
4、协程简单实现
5、RPC实现
准备: 1、先安装php各种扩充,有的扩充不兼容需要禁用
2、先安装 swoftcli,能让修改代码重新启动,生效。https://www.swoft.org/docs/2.x/zh-CN/tool/swoftcli/index.html
一、Http/Https服务控制器
1、配置,在 /app/bean.php中
'httpServer' => [
'class' => HttpServer::class,
'port' => 18306,
'listener' => [
],
'process' => [
],
'on' => [
],
// 'type' => SWOOLE_SOCK_TCP | SWOOLE_SSL, //支持https,必须安装OpenSSL扩充
/* @see HttpServer::$setting */
'setting' => [0
'worker_num' => 4,
//支持https,签名文件
// 'ssl_cert_file' => '/my/certs/2288803_www.domain.com.pem',
// 'ssl_key_file' => '/my/certs/2288803_www.domain.com.key',
]
],
2、新建控制器,在 /app/Http/Controller/文件夹下新建文件 IndexController.php
/**
* Class IndexController
* @package App\Http\Controller
* @Controller(prefix="/apidemo")
*/
class IndexController{
/**
* @RequestMapping("index",method={RequestMethod::GET})
* @throws \Swoft\Exception\SwoftException
*/
public function index(){
$res = Context()->getResponse(); $data = ['name'=>'Swoft2.0.2222'];
return $res->withData($data);
} /**
* @RequestMapping("index_v2")
* @throws \Swoft\Exception\SwoftException
*/
public function indexV2(){
$res = Context()->getResponse(); $data = ['name'=>'Swoft2.0.2222'];
return $res->withData($data);
}
}
注意事项:1、Swoft路径全部使用注解方式进行。注解必须使用 /** 开始,不能少或者多 * ,只能是两个* ,不然会报错。
2、如果有其他注释,不能出现@符合,如下:
/**
*
* //路径解析
* //将此注解应用于 Action 上,则作用域仅为当前的 Action @Middleware 用于配置单个中间件 @Middlebrows 用于配置一组 Middleware
* * @RequestMapping("demo_middle")
*/
会报错,蓝色部分是你的注释,其中 @Middleware 不能加@符号,不然会报错。
3、路由访问是通过 @Controller(prefix="/apidemo") 中的prefix + 类中每个方法的@RequestMapping("index") 参数:url/apidemo/index 进行访问当前控制器的方法。
4、如果有多个方法的路由相同,会以最后一个为准,覆盖之前的。 详细路由查看:https://www.swoft.org/docs/2.x/zh-CN/http-server/route.html
3、启动 swoftcli run -c http:start -b bin/swoft

浏览器访问 http://127.0.0.1:18306/apidemo/index
二:验证器:https://www.swoft.org/docs/2.x/zh-CN/validator/index.html
1、安装组件 composer require swoft/validator
2、配置
'httpDispatcher' => [
// Add global http middleware
'afterMiddlewares' => [
\Swoft\Http\Server\Middleware\ValidatorMiddleware::class
]
],
3、在文件夹 /app/Validator/下新建文件DemoValidator.php
<?php declare(strict_types=1); namespace App\Validator;
use Swoft\Validator\Annotation\Mapping\Validator;
use Swoft\Validator\Contract\ValidatorInterface;
use Swoft\Validator\Exception\ValidatorException;
/**
* Class DemoValidator
*
* @since 2.0
*
* @Validator(name="demoValidator") //给验证器取个名字
*/
class DemoValidator implements ValidatorInterface
{
/**
* @return array
* @throws ValidatorException
*/
public function validate(array $data, array $params): array
{
$start = $data['start'] ?? null;
$end = $data['end'] ?? null;
if ($start === null && $end === null) {
throw new ValidatorException('Start time and end time cannot be empty');
}
if ($start > $end) {
throw new ValidatorException('Start cannot be greater than the end time');
}
return $data;
}
}
4、使用。在前面新建的控制器中
/**
* 访问: http://127.0.0.1:18306/apidemo/valida_v2?start=4&end=2
*
* @RequestMapping("valida_v2") //路由
* @Validate(validator="demoValidator",type=ValidateType::GET) //使用验证器,默认是post验证,加上type修改验证请求方式
* @throws \Swoft\Exception\SwoftException
*/
public function validaV2Controller(){
$res = context()->getResponse();
$data = ['name'=>'Swoft2.0.2222']; return $res->withData($data);
}
访问: http://127.0.0.1:18306/apidemo/valida_v2?start=4&end=8 ,不加参数或者end比start值大都会抛出异常
三、中间件:https://www.swoft.org/docs/2.x/zh-CN/http-server/middleware.html
1、定义,在文件夹 /app/Http/Middleware/ 下新建文件DemoMiddleware.php
只需要实现了 Swoft\Http\Server\Contract\MiddlewareInterface 接口均为一个合法的中间件,其中 process() 方法为该中间件逻辑处理方法 <?php declare(strict_types=1); namespace App\Http\Middleware; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Http\Server\Contract\MiddlewareInterface; /**
* //中间件必须实现 MiddlewareInterface 接口
* @Bean()
*/
class DemoMiddleware implements MiddlewareInterface{
/**
* @return ResponseInterface
* @inheritdoc
* @throws \Swoft\Exception\SwoftException
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// TODO: Implement process() method.
$path = $request->getUri()->getPath(); var_dump($path); $request = $handler->handle($request);
return $request; }
2、全局使用,当中间件需要全局使用时,直接在bean中配置。否则使用步骤3.
'httpDispatcher' => [
// Add global http middleware
'middlewares' => [
\App\Http\Middleware\FavIconMiddleware::class,
\App\Http\Middleware\DemoMiddleware::class //添加新的中间件,添加后会让所有控制器都会默认使用该控制器
],
'afterMiddlewares' => [
\Swoft\Http\Server\Middleware\ValidatorMiddleware::class
]
],
3、不进行全局使用时,在需要的地方进行注解使用。在前面创建的控制器中。
use App\Http\Middleware\DemoMiddleware; //先在类最上面引用
/**
*
* //中间间测试用
* //当将此注解应用于 Controller 上,则作用域为整个 Controller
* //将此注解应用于 Action 上,则作用域仅为当前的 Action Middleware 用于配置单个中间件 Middlebrows 显而易见的是用于配置一组 Middleware,按照定义顺序依次执行
*
* @RequestMapping("demo_middle")
*
* @Middleware(DemoMiddleware::class) //通过注解加入中间件,只有当前路由会使用到该中间件
*/
public function demoMiddle(){
return "dddd";
}
参考文档 :
源码解析:https://www.jianshu.com/p/2f679e0b4d58
Swoft2.x 小白学习笔记 (一) ---控制器的更多相关文章
- Swoft2.x 小白学习笔记 (四) --- RPC
介绍 swoft 中 RPC使用:搭建访问服务端和客户端 RPC服务端: 一.配置,在文件 /app/bean.php中添加 return [ 'rpcServer' => [ 'class' ...
- Swoft2.x 小白学习笔记 (二) --- mysql、redis
介绍swoft中 1.mysql. 2.Redis 一.mysql使用: 1.配置,在 app\bean.php文件中 'db' => [ 'class' => Database::cla ...
- Swoft2.x 小白学习笔记 (三) --- Task、协程
介绍swoft中 1.Task 2.协程 一:Task任务: 1.配置,在 app/bean.php文件中加入 'httpServer' => [ // ... 'on' => [ Swo ...
- ThinkPHP 学习笔记 ( 二 ) 控制器 ( Controller )
/** * ThinkPHP version 3.1.3 * 部署方式:应用部署 * 文内的 http://localhost/ 由实际主机地址代替 */ 入口文件 index.php: <?p ...
- IOS 学习笔记 2015-04-15 控制器数据反向传值
// // FirstViewController.h // 控制器数据传递 // // Created by wangtouwang on 15/4/15. // Copyright (c) 201 ...
- STM32学习笔记——DMA控制器(向原子哥学习)
一.DMA简介 DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.当 CPU 初始化这个传输动作,传输 ...
- ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器
[TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试. 在解决方案上右键,选择"管理NuGet程序包& ...
- Symfony2 学习笔记之控制器
一个controller是你创建的一个PHP函数,它接收HTTP请求(request)并创建和返回一个HTTP回复(Response).回复对象(Response)可以是一个HTML页面,一个XML文 ...
- ------------------java collection 集合学习 ----小白学习笔记,,有错,请指出谢谢
<!doctype html>java对象集合学习记录 figure:first-child { margin-top: -20px; } #write ol, #write ul { p ...
随机推荐
- js面向对象学习笔记
1.函数的定义方式 第一种定义方式 function fn1() { alert("fn1"); } alert(fn) 函数就是一个特殊的对象,是一个Function类的实例,其 ...
- T2695 桶哥的问题——吃桶 题解
校内测试 ------T3 对于这个题,首先想到的应该就是暴力枚举了吧,看看数据范围,60就是白送的啦!(但是我也不知道怎么才20分qwq) 思路分析: 这个题要你求所有套餐的总价值,先看一眼产生套餐 ...
- Python3 Address already in use 解决方法
1.查看使用端口号netstat -ntlp 2.根据端口号找到pid 3.杀死程序 kill -9 pid 4.重新启动程序 简单粗暴 我使用python3时编写Socket,linux系统下使用c ...
- 1.RabbitMq - Work 模式
RabbitMq - Work 模式 一.什么是Work模式 如果有几个消息都需要处理,且每个消息的处理时间很长,仅有一个消费者,那么当它在处理一个消息的时候,其他消息就只有等待. 等待有时候是好的, ...
- Python驱动Headless Chrome
Headelss 比Headed的浏览器在内存消耗,运行时间,CPU占用都更具优势 from selenium import webdriverfrom selenium.webdriver.chro ...
- axios的get请求无法设置Content-Type
最近在与后端的项目对接中,接口工具使用了axios这个东西.怎么说那 ,反正有很多坑,在后端的请求中要设置GET 请求中要设置header中的Content-Type为application/json ...
- Python locust性能测试框架模板
locust框架模板 from locust import HttpLocust, TaskSet, task import Queue class UserBehavior(TaskSet): de ...
- linux系统空间不足,不重启进程,清理僵尸文件。
问题:通过lsof |grep delete命令可以看到状态为delete的进程文件占用了较多的空间,导致系统磁盘空间不足,而du 命令看到的磁盘空间占用没那么高. 得到僵尸文件名称:catalina ...
- JVM | 分代垃圾回收策略的基本概念以及过程
一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...
- 解决 无法启动此程序,因为计算机中丢失opencv_world341.dll。请尝试重新安装改程序已解决此问题
在运行OpenCV程序时报错:“无法启动此程序,因为计算机中丢失opencv_world341.dll.请尝试重新安装改程序已解决此问题”. 解决方法 我的bin目录是 D:\opencv\build ...