swoft 切面AOP尝试

官网文档 https://www.swoft.org/documents/v2/basic-components/aop/    官网的文档已经写得很好

另外一篇写得很好的文章:https://blog.csdn.net/hualaoshuan/article/details/105076999 

视频教程 https://www.bilibili.com/video/BV12J411j721?p=51          swoft 入门到微服务

切面  就是不破坏原有代码逻辑,往里面加入需要执行的前置 后置 操作

  • PointBean:定义 目标类切点
    • include:需被 指定 为切点的目标类集合
    • exclude:需被 排除 为切点的目标类集合
  • PointAnnotation:定义 注解类 切点,所有使用对应注解的方法均会通过该切面类代理
    • inlucde:需被 织入 的注解类集合
    • exclude:需被 排除 的注解类集合
  • PointExecution:定义 确切的目标类方法
    • include:需被 织入 的目标类方法集合,支持正则表达式
    • exclude:需被 排除 的目标类方法集合,支持正则表达式

定义切面类  app\Aspect\TestAspect.php

指定方法切入的

<?php

namespace App\Aspect;
use Swoft\Aop\Annotation\Mapping\After;
use Swoft\Aop\Annotation\Mapping\Aspect;
use Swoft\Aop\Annotation\Mapping\Before;
use Swoft\Aop\Annotation\Mapping\PointExecution;


/**
 * @Aspect()
 * @PointExecution(include={"App\Http\Controller\HomeController::hi.*"})
 */
class TestAspect
{
    /**
     * @Before()
     */
    public function before()
    {
        echo "我是前置".PHP_EOL;
    }

    /**
     * @After()
     */
    public function after()
    {
        echo "我是后置".PHP_EOL;
    }
}

浏览器访问 /hi 

控制台输出

     ____            _____    ___   ___

    / __/    _____  / _/ /_  |_  | / _ \

   _\ \| |/|/ / _ \/ _/ __/ / __/_/ // /

  /___/|__,__/\___/_/ \__/ /____(_)___/

   



                           SERVER INFORMATION(v2.0.9)

  ********************************************************************************

  * HTTP     | Listen: 0.0.0.0:18306, Mode: Process, Worker: 6, Task worker: 12

  ********************************************************************************



HTTP Server Start Success!

2020/07/18-19:18:38 [INFO] Swoft\Server\Server:startSwoole(491) Swoole\Runtime::enableCoroutine

2020/07/18-19:18:38 [INFO] Swoft\Listener\BeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid

2020/07/18-19:18:38 [INFO] Swoft\Listener\BeforeStartListener:handle(28) Registered swoole events:

 start, shutdown, managerStart, managerStop, workerStart, workerStop, workerError, request, task, finish

Server start success (Master PID: 16060, Manager PID: 16065)

我是前置

我是后置

访问hello 控制台不会触发 不会打印

如果改为 

/**
 * @Aspect()
 * @PointExecution(include={"App\Http\Controller\HomeController::h.*"})
 */
就会触发了

通过使用连接点 joinpoint 可以拿到执行方法的参数  返回值等 可以放到前置 做鉴权 后置 做日志
<?php

namespace App\Aspect;
use Swoft\Aop\Annotation\Mapping\After;
use Swoft\Aop\Annotation\Mapping\AfterReturning;
use Swoft\Aop\Annotation\Mapping\Aspect;
use Swoft\Aop\Annotation\Mapping\Before;
use Swoft\Aop\Annotation\Mapping\PointExecution;
use Swoft\Aop\Point\JoinPoint;
use Swoft\Http\Message\Request;

/**
 * @Aspect()
 * @PointExecution(include={"App\Http\Controller\HomeController::h.*"})
 */
class TestAspect
{
    /**
     * @Before()
     * @param JoinPoint $joinPoint
     */
    public function before(JoinPoint $joinPoint)
    {
        echo "我是前置".PHP_EOL;
        /** @var Request $request */
        $request = $joinPoint->getArgs()[0];
        $params = $request->getQueryParams(); //可以用来做鉴权
        var_dump($params);
    }

    /**
     * @After()
     */
    public function after()
    {
        echo "我是后置".PHP_EOL;
    }

    /**
     * @AfterReturning()
     * @param JoinPoint $joinPoint
     * @param $request Request
     */
    public function afterrunning(JoinPoint $joinPoint)  // 可以日志记录
    {

        echo "程序执行完了".PHP_EOL;
//        /** @var Request $request */
//        $request = $joinPoint->getArgs()[0];
//        $params = $request->getBody();
//        var_dump($params);

        return $joinPoint->getReturn();
    }
}

访问浏览器  结果如下 

HTTP Server Start Success!

2020/07/18-19:42:54 [INFO] Swoft\Server\Server:startSwoole(491) Swoole\Runtime::enableCoroutine

2020/07/18-19:42:54 [INFO] Swoft\Listener\BeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid

2020/07/18-19:42:54 [INFO] Swoft\Listener\BeforeStartListener:handle(28) Registered swoole events:

 start, shutdown, managerStart, managerStop, workerStart, workerStop, workerError, request, task, finish

Server start success (Master PID: 16459, Manager PID: 16464)

我是前置

array(1) {

  ["id"]=>

  string(1) "4"

}

我是后置

程序执行完了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值