[TOC]
### 前置切面
* * * * *
可以在方法运行前添加切面
```
//在UserLogic调用saveUser,delUser方法前调用UserLogicTestAop的testBefore方法
AopBuild::before(UserLogic::class)
->methods(["saveUser","delUser"])
->wave(UserLogicTestAop::class)
->using("testBefore")
->addPoint();
```
配置多个时会按配置顺序依次执行
对应的切面写法
```
public function testBefore(JoinPoint $point){
$hasReturn = $point->hasReturn() ;//检查前面的前置方法有没有返回 值或抛出异常,可以根据此判定当前逻辑是否继续执行
$args=$point->getArgs();//调用的参数
$method=$point->getMethod();//对应的反射方法
$obj=$point->getObj();//对应包装对象
$target=$point->getTarget();//对应目标对象
// $point->setArgs(array(1,2));//可以通用setArgs对传入参数进行修改
trace("执行testBefore".json_encode($point));
}
```
JoinPoint 类中包含我们需要的基本信息
> 同时我们可以通过setArgs修改传入参数
### 后置切面
* * * * *
可以在方法运行后添加切面
```
//在UserLogic调用方法以save或del开头的方法前调用UserLogicTestAop的testAfter方法
AopBuild::after(UserLogic::class)
->methodsStart(["save","del"])
->wave(UserLogicTestAop::class)
->using("testAfter")
->addPoint();
```
配置多个时会按配置顺序挨个执行
对应的切面写法
```
public function testAfter(JoinPoint $point,$result){
//$result是前置方法或原方法返回的结果,如果前置方法或原方法有抛异常则$result为对应的 throwable
trace("执行testAfter").json_encode($point);
$args=$point->getArgs();//调用的参数
$argsMap=$point->getArgMap();//键值对类型
$clazz=$point->getOriginalClass();//获取原始需要包装的类
$method=$point->getMethod();//对应的反射方法
$obj=$point->getObj();//对应包装对象
$target=$point->getTarget();//对应目标对象
$result['msg']="UserLogicTestAop将值修改了啊";
return $result;
}
```
JoinPoint 类中包含我们需要的基本信息
> $result 为返回的结果 我们可以对结果进行修改,最后记得将修改后的结果返回
### 环绕切面
* * * * *
我们可以在对方法进行环绕添加切面,环绕切面可以控制是否运行
> 因机制问题一个方法的环绕切面只能有一个,建议使用前置,后置切面进行替代
```
AopBuild::before(UserLogic::class)
->around(["saveUser","delUser"])
->wave(UserLogicTestAop::class)
->using("testAround")
->addPoint();
```
对应的切面写法
```
public function testAround(JoinPoint $point){
//在操作前面的活
$result= $point->process($point->getArgs());//执行操作
//操作后面的活
trace("执行testAround");
return $result;
}
```
- 序言
- 开始
- 安装 RapPhp
- 应用目录
- 配置文件
- 入口类
- MVC架构
- 控制器基础
- 前置方法
- 拦截器
- 动态路由
- Request和Response
- Cookie和Session
- 模板引擎
- 请求缓存
- 流程图
- 数据库
- 基础使用
- 查询语法
- 查询操作
- where
- order
- limit
- lock
- fields
- join
- distinct
- having
- group
- force
- 查询方法
- 多数据源
- 数据库类型
- Record模型
- 使用Record
- 增删改
- 查找方法
- 数据类型
- 基本类型
- JSON 数据类型
- time
- date
- attach
- const
- 迭代操作
- record 更多方法
- 注入与转json
- 多级缓存
- 多数据源
- 模型生成
- 回调事件
- IOC控制反转
- Ioc基础概念
- 依赖注入
- Scope作用域
- 构造器
- 循环依赖
- AOP面向切面
- AOP使用
- 切面
- AopBuild
- 生成 aop 文件
- 事件勾子
- 执行循序
- Swoole
- Http服务器
- 用户进程
- Context上下文(重要)
- 协程
- 特色功能
- 限流器
- 连接池
- 数据库连接池
- Redis 连接池
- 通用连接池
- Rpc 远程调用
- Rpc服务提供方
- Rpc客户端
- 熔断器与服务降级
- Redis 分布式锁
- 其他功能
- 缓存
- redis
- 文件存储
- 存储简介
- 本地存储
- OSS存储
- 配置
- 日志
- 验证器
- FileUtil
- 数组Util
- Http工具
- 多语言
- 命令行
- 使用命令行
- 生成模型文件
- AOP动态文件生成
- swoole_http服务器
- 自定义命令行
- 异常与调试
- 异常抛出
- 异常处理
- 部署
- URL重写
- DOCKER 镜像(重要)
- 附录
- 回调事件
- 开发规范
- Swoole开发注意点
- 热点行更新排队机制
