xtompie/aop

0.2 2023-02-05 10:43 UTC

This package is auto-updated.

Last update: 2024-09-06 00:20:59 UTC


README

此库需要在原始源代码中进行更改。

简单和概括地说,AOP 是带有中间件的发布/订阅系统。

要求

PHP >= 8.0

安装

使用 composer

composer require xtompie/aop

文档

1. 创建方面

方面是实现 Aspect 接口的一个类。

<?php

namespace Xtompie\Aop;

interface Aspect
{
    public function order(): float;
    public function joinpoint(string $joinpoint): bool;
    public function advice(Invocation $invocation): mixed;
}

库提供了一个抽象类 GenericAspect

<?php

use Xtompie\Aop\GenericAspect;

class DebugAspect implements GenericAspect
{
    protected function pointcuts(): array
    {
        return [
            'FoobarService::*',
        ];
    }

    public function advice(Invocation $invocation): mixed
    {
        $result = $invocation();
        var_dump([
            'AOP',
            'joinpoint' => $invocation->joinpoint(),
            'args' => $invocation->args(),
            'result' => $result,
        ]);
        return $result;
    }
}

切入点是一个可以匹配连接点的模式。切入点可以有一个 * 字符,表示任何字符可以出现任意次数。如果没有 *,则等于连接点。

只有一个类型的建议 - 周围。在前后可以通过手动或使用 GenericAspect 来实现。

2. 创建 AOP 系统

<?php

use Xtompie\Aop\Aop;

$aop = new Aop([
    new DebugAspect(),
]);

function aop(string $joinpoint, array $args, callable $main): mixed
{
    return $GLOBALS['aop']->__invoke($joinpoint, $args, $main);
}

3. 在服务中创建连接点

<?php

class FoobarService
{
    public function baz(int $a): int
    {
        return aop(__METHOD__, func_get_args(), function(int $a) { // <-- added line
            return $a + 1;
        }); // <-- added line
    }
}

4. 修改调用参数

<?php

use Xtompie\Aop\GenericAspect;

class AddFiveAspect implements GenericAspect
{
    protected function pointcuts(): array
    {
        return [
            'FoobarService::__invoke',
        ];
    }

    public function advice(Invocation $invocation): mixed
    {
        $invocation = $invocation->withArgs([$invocation->args()[0] + 5]);
        return $invocation();
    }
}

5. 修改方面顺序

顺序越高,越接近主要调用。

<?php

use Xtompie\Aop\GenericAspect;

class AddFiveAspect implements GenericAspect
{
    public function order(): float
    {
        return 10;
    }

    // ...
}

6. 替换原始调用

不要调用调用链 $invocation()

<?php

use Xtompie\Aop\GenericAspect;

class MinusTeenAspect implements GenericAspect
{
    public function order(): float
    {
        return 999;
    }

    protected function pointcuts(): array
    {
        return [
            'FoobarService::__invoke',
        ];
    }

    public function advice(Invocation $invocation): mixed
    {
        return $invocation->args()[0] - 10;
    }
}