2021-06-11 hyperf AOP 面向切面编程

用通俗的话来讲,就是在 Hyperf 里可以通过 切面(Aspect) 介入到任意类的任意方法的执行流程中去,从而改变或加强原方法的功能,这就是 AOP。

第一步新建app/Aspect/IndexAspect.php

切入注解-- 切面中获取参数

<?php
namespace App\Aspect;

use Hyperf\Di\Annotation\Inject;
use App\Annotation\Foo;
use App\Controller\User\IndexController;
use Hyperf\Di\Annotation\Aspect;    #用 @Aspect 注解时需 use Hyperf\Di\Annotation\Aspect; 命名空间;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;
use Hyperf\HttpServer\Contract\RequestInterface;
/**
 * @Aspect
 */
class IndexAspect extends AbstractAspect{
    /**
     * @Inject 
     * @var RequestInterface
     */
    private $request;   # 在这定义什么 下面$this -> 就需要是什么    $this->request->all();
    // 要切入的注解,具体切入的还是使用了这些注解的类,仅可切入类注解和类方法注解
    public $annotations  = [
        Foo::class,
    ];
    #每个 切面(Aspect) 必须定义 @Aspect 注解或在 config/autoload/aspects.php 内配置均可发挥作用。

    public function process(ProceedingJoinPoint $proceedingJoinPoint){
        
        // 切面切入后,执行对应的方法会由此来负责
        // $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果
        $all = $this->request->all();   #获取到这个参数可以在返回错误的时候做日志把请求参数保存起来到时候复现
        var_dump('获取所有值');
        var_dump($all);

        $result = $proceedingJoinPoint->process();
        // 在调用前进行某些处理
        $bar  = "";
        $foo  = $proceedingJoinPoint->getAnnotationMetadata()->class[Foo::class]; #这个是获取class上面的注解
        // $proceedingJoinPoint -> getAnnotationMetadata -> method();  这个是获取class上面的注解
        $bar = $foo->bar;
        var_dump('123123');
        var_dump($bar);
        // 在调用后进行某些处理
        return $result . $bar;
    }

}




在这里插入图片描述

切入类

<?php
namespace App\Aspect;

use App\Controller\User\IndexController;
use Hyperf\Di\Annotation\Aspect;    #用 @Aspect 注解时需 use Hyperf\Di\Annotation\Aspect; 命名空间;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;

/**
 * @Aspect
 */
class IndexAspect extends AbstractAspect{
    // 要切入的类或 Trait,可以多个,亦可通过 :: 标识到具体的某个方法,通过 * 可以模糊匹配
    public $classes = [
        IndexController::class . '::' . 'index',
    ];
    #每个 切面(Aspect) 必须定义 @Aspect 注解或在 config/autoload/aspects.php 内配置均可发挥作用。

    public function process(ProceedingJoinPoint $proceedingJoinPoint){
        var_dump(__CLASS__);
        // 切面切入后,执行对应的方法会由此来负责
        // $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果
        // 在调用前进行某些处理
        $result = $proceedingJoinPoint -> process();
        // 在调用后进行某些处理
        return $result . "fanhuizhi";
    }

}

IndexController 切入的类在码云上

IP:9501/user/index/index?id=8989 请求地址

切面中获取参数是使用依赖注入的方法,我感觉这解决了我一个心结,很好的长进, 要多使用依赖注入

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值