swoft 切面AOP尝试

Posted brady-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"
}
我是后置
程序执行完了

  

 

以上是关于swoft 切面AOP尝试的主要内容,如果未能解决你的问题,请参考以下文章

学习swoft的第三天_AOP切面

JAVA之AOP

AOP 面向切面编程

AOP面向切面编程

Spring的AOP面向切面编程

面向切面编程