next/aop 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

next/aop

Composer 安装命令:

composer require next/aop

包简介

An AOP package that is resident in in-memory PHP frameworks, such as nextphp, WebMan.

README 文档

README

一款简单Aop实现。支持常驻内存型PHP应用。可以方便接入nextphp, Swoole,WebMan等框架。

环境要求

php 8.2
开启passthru函数

安装

composer require next/aop

使用,以下以webman为例

修改start.php文件

Aop::init(
    [__DIR__ . '/../app'],
    [
        \Next\Aop\Collector\PropertyAttributeCollector::class,
        \Next\Aop\Collector\AspectCollector::class,
    ],
    __DIR__ . '/../runtime/aop',
);
  • paths 注解扫描路径
  • collectors 注解收集器
    • \Next\Aop\Collector\AspectCollector::class 切面收集器,取消后不能使用切面
    • \Next\Aop\Collector\PropertyAttributeCollector::class 属性注解收集器,取消后不支持属性自动注入
  • runtimeDir 运行时,生成的代理类和代理类地图会被缓存到这里

编写切面类,实现AspectInterface接口

<?php

namespace App\aspects;

use Next\Aop\ProceedingJoinPoint;
use Next\Aop\Contract\AspectInterface;

#[\Attribute(\Attribute::TARGET_METHOD)]
class Round implements AspectInterface
{
    public function process(ProceedingJoinPoint $joinPoint): mixed
    {
        echo 'before';
        $result = $joinPoint->proceed(); // 直接调用被代理的方法
//        $result = $joinPoint->process(); // 继续执行其他切面逻辑
        echo 'after';
        return $result;
    }
}

修改方法添加切面注解

<?php

namespace app\controller;

use App\Aop\Attribute\Inject;use App\aspects\Round;use support\Request;

class Index
{
    #[Inject]
    protected Request $request;

    #[Round]
    public function index()
    {
        echo '--controller--';
        return response('hello webman');
    }
}

注意上面添加了两个注解,属性和方法注解的作用分别为注入属性和切入方法,可以直接在控制器中打印属性$request发现已经被注入了,切面注解可以有多个,会按照顺序执行。具体实现可以参考这两个类,注意这里的Inject注解并不是从webman容器中获取实例,所以使用的话需要重新定义Inject以保证单例

你也可以使用AspectConfig注解类配置要切入的类,例如上面的切面类

<?php

namespace App\aspects;

use Next\Aop\Attribute\AspectConfig;
use Next\Aop\ProceedingJoinPoint;
use Next\Aop\Contract\AspectInterface;

#[\Attribute(\Attribute::TARGET_METHOD)]
#[AspectConfig('BaconQrCode\Writer', 'writeFile')]
class Round implements AspectInterface
{
    public function process(ProceedingJoinPoint $joinPoint): mixed
    {
        echo 'before';
        $result = $joinPoint->process();
        echo 'after';
        return $result;
    }
}

那么BaconQrCode\Writer类的writeFile方法将会被切入,该注解可以传递第三个参数数组,作为该切面构造函数的参数

启动

php start.php start

打开浏览器打开对应页面

控制台输出内容为

before--controller--after

next/aop 适用场景与选型建议

next/aop 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 36 次下载、GitHub Stars 达 9, 最近一次更新时间为 2023 年 10 月 31 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 next/aop 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 next/aop 我们能提供哪些服务?
定制开发 / 二次开发

基于 next/aop 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 36
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 10
  • 点击次数: 25
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 9
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: Apache-2.0
  • 更新时间: 2023-10-31