• swoft 切面AOP尝试


    官网文档 https://www.swoft.org/documents/v2/basic-components/aop/

    视频教程 https://www.bilibili.com/video/BV12J411j721?p=51

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

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

    定义切面类  appAspectTestAspect.php

    指定方法切入的

    <?php
    
    namespace AppAspect;
    use SwoftAopAnnotationMappingAfter;
    use SwoftAopAnnotationMappingAspect;
    use SwoftAopAnnotationMappingBefore;
    use SwoftAopAnnotationMappingPointExecution;
    
    /**
     * @Aspect()
     * @PointExecution(include={"AppHttpControllerHomeController::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] SwoftServerServer:startSwoole(491) SwooleRuntime::enableCoroutine
    2020/07/18-19:18:38 [INFO] SwoftListenerBeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid
    2020/07/18-19:18:38 [INFO] SwoftListenerBeforeStartListener: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={"AppHttpControllerHomeController::h.*"})
    */
    就会触发了



    通过使用连接点 joinpoint可以拿到执行方法的参数 返回值等 可以放到前置 做鉴权 后置 做日志
    <?php
    
    namespace AppAspect;
    use SwoftAopAnnotationMappingAfter;
    use SwoftAopAnnotationMappingAfterReturning;
    use SwoftAopAnnotationMappingAspect;
    use SwoftAopAnnotationMappingBefore;
    use SwoftAopAnnotationMappingPointExecution;
    use SwoftAopPointJoinPoint;
    use SwoftHttpMessageRequest;
    
    /**
     * @Aspect()
     * @PointExecution(include={"AppHttpControllerHomeController::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] SwoftServerServer:startSwoole(491) SwooleRuntime::enableCoroutine
    2020/07/18-19:42:54 [INFO] SwoftListenerBeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid
    2020/07/18-19:42:54 [INFO] SwoftListenerBeforeStartListener: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"
    }
    我是后置
    程序执行完了
    

      

  • 相关阅读:
    黑马程序员__OC三大特性
    黑马程序员___OC类和对象
    黑马程序员___预处理指令
    黑马程序员___数据类型总结
    黑马程序员__指针
    黑马程序员__C语言__函数__static和extern
    黑马程序员__C语言__流程控制__选择结构
    黑马程序员__C语言__循环结构
    入园随笔
    Fiddler中抓取不到Jmeter模拟的请求包。
  • 原文地址:https://www.cnblogs.com/brady-wang/p/13337069.html
Copyright © 2020-2023  润新知