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:需被 排除 的目标类方法集合,支持正则表达式

定义切面类  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"
}
我是后置
程序执行完了

  

 

上一篇:[手把手教你] 用Swoft 搭建微服务(TCP RPC)


下一篇:基于 Swoft 协程框架的 PHP 微服务治理