首页 > 编程语言 >Hyperf 的AOP 面向切面编程实战

Hyperf 的AOP 面向切面编程实战

时间:2024-05-06 15:34:51浏览次数:24  
标签:Aspect Hyperf 切面 注册 AOP 方法

概念

AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过动态代理等技术实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,也是 Hyperf 中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

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

注意这里所指的任意类并不是完全意义上的所有类,在 Hyperf 启动初期用于实现 AOP 功能的类自身不能被切入。

介绍

相对于其它框架实现的 AOP 功能的使用方式,我们进一步简化了该功能的使用不做过细的划分,仅存在 环绕(Around) 一种通用的形式:

  • 切面(Aspect) 为对流程织入的定义类,包括要介入的目标,以及实现对原方法的修改加强处理
  • 代理类(ProxyClass) ,每个被介入的目标类最终都会生成一个代理类,来达到执行 切面(Aspect) 方法的目的

AOP的使用

示例如下,定义一个切面 /App/Aspect/TestAspect.php 切入到用户注册UserController/register 方法中,实现注册之前和注册完成后的逻辑控制:

(每个切面必须定义 @Aspect 注解或在 config/autoload/aspects.php 内进行配置)

<?php
namespace App\Aspect;
use App\Controller\UserController;
//use App\Annotation\SomeAnnotation;
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;
/**
 * @Aspect
 */
class TestAspect extends AbstractAspect
{
    //要切入的类或Trait或方法,可以多个
    public $classes = [
        //以下三种方式示例效果相同
        'App\Controller\UserController::register', //切入具体某个方法
//        UserController::class, //切入类
//        'App\Controller\UserController::*ter', //通过*模糊匹配
    ];

    //要切入的注解,具体切入的还是使用了这些注解的类,仅可切入类注解和类方法注解
    public $annotations = [
//        SomeAnnotation::class,
    ];

    //切面切入后执行的控制逻辑
    public function process(ProceedingJoinPoint $proceedingJoinPoint)
    {
        //示例:调用前进行某些处理
        echo date("H:i:s",time()) . ":切入注册方法\n";

        //示例:调用后进行某些处理
        $result = $proceedingJoinPoint->process(); //通过连接点的process()方法获得调用原方法结果
        echo date("H:i:s",time()) . ":注册成功uid:". $result["uid"] . "\n";
    }
}

用户注册:

<?php

declare(strict_types=1);
namespace App\Controller;
use Hyperf\HttpServer\Annotation\AutoController;
use Hyperf\Di\Annotation\Inject;
/**
 * @AutoController()
 */
class UserController
{
    //注册
    public function register()
    {
        echo date("H:i:s",time()) . ":开始注册\n";
        sleep(1);
        echo date("H:i:s",time()) . ":完成注册\n";

        //用户信息
        $userInfo = ['uid' => 666, 'mobile'=> 18888888888];

        return $userInfo;
    }
}

 

调用结果如下:

切入注册方法
开始注册
完成注册
注册成功uid:666

https://www.shanhubei.com/archives/55324.html

标签:Aspect,Hyperf,切面,注册,AOP,方法
From: https://www.cnblogs.com/shanhubei/p/18175074

相关文章

  • 总结一下公共字段(aop加自定义注解加反射)
    应用场景在一些业务类的创建中,我们需要反复对不同的类的同一个属性进行赋值,那么问题就出现了**代码冗余**如何解决呢思路:利用aop创造一个切面如何创造一个切面呢实质上就是扫描加设置增强位置那么如何扫描到对应的赋值方法上呢这里需要用到自定义注解了自定义注解://这......
  • Spring AOP
    AOP简介A0P(AspectOrientedProgramming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(objectOrientedProgramming)面向对象编程作用:在不惊动原始设计的基础上为其进行功能增强Spring理念:无入侵式/无侵入式AOP核心概念连接点(JoinPoint):程序执行过程中的......
  • 基于Hyperf的CMS,企业官网通用php-swoole后台管理系统
    2023年9月11日10:47:00仓库地址:https://gitee.com/open-php/zx-hyperf-cmsCMS,企业官网通用PHP后台管理系统框架介绍hyperfSCUI后端开发组件php8.1hyperf3.1数据库sql(使用最新日期文件)hyperf\doc\sql_bakmysql8.系统默认账号密码:admin/admin前端开发组件scui......
  • simpread-课程 24:工作单元之数据库事务【AOP】
    一、工作单元事务代码分析在上一个课程,我们已经实现了数据库事务功能,来保证数据的完整性。通过上一个课程的实现方式,我们在每一个Action开头和结尾,都需要添加对应的代码,才能实现事务功能,具体见以下截图:这种实现方式存在以下2个问题:在具体业务开发中,一个请求往往都会涉......
  • hyperf文件上传和url函数
    2024年4月29日11:24:35配置静态资源如果您希望Swoole来管理静态资源,请在config/autoload/server.php配置中增加以下配置。return['settings'=>[...//静态资源'document_root'=>BASE_PATH.'/public','enable_sta......
  • Asp-Net-Core开发笔记:使用AOP实现动态审计日志功能
    前言#最近一直在写Go和Python,好久没写C#,重新回来写C#代码时竟有一种亲切感~说回正题。在当今这个数字化迅速发展的时代,每一个操作都可能对业务产生深远的影响,无论是对数据的简单查询,还是对系统配置的修改。在这样的背景下,审计日志不仅仅是一种遵循最佳实践的手段,更是......
  • Spring(3)-AOP快速入手
    经过前面Spring(1)-粗解动态代理-marigo-博客园Spring(2)-粗解横切关注点-marigo-博客园两篇内容,我们可以引入AOP了。AOP的简单理解AOP的全称(aspectorientedprogramming),面向切面编程。我们在此之前接触的更多是OOP,也就是面向对象编程。OOP和AOP有什么异同,网上有......
  • Spring(4)-AOP使用细节
    有了Spring(3)-AOP快速入手-marigo-博客园的学习,大体知道AOP的使用,接下来我们对AOP的细节进行展开。AOP-切入表达式作用:通过表达式定位一个或者多个连接点连接点可以理解成我们要切入到哪个类的哪个具体方法语法:execution([权限修饰符][返回值类型][简单类名/全类名][......
  • SpringBoot整合AOP实现打印方法执行时间切面
    pom.xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>代码创建注解importjava.lang.annotation.ElementType;importja......
  • Unity的AOP应用 应用场景 C#
    在C#中,Unity容器是一个功能强大的依赖注入(DI)容器,它提供了丰富的配置选项来管理对象的生命周期,支持特殊类型的处理,并允许通过配置文件来简化注册和配置过程。同时,Unity还提供了面向切面编程(AOP)的功能,允许开发者在不改变现有代码逻辑的情况下,为对象的方法添加额外的行为。1.Unity......