用通俗的话来讲,就是在 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 请求地址
切面中获取参数是使用依赖注入的方法,我感觉这解决了我一个心结,很好的长进, 要多使用依赖注入