xtompie / aop
0.2
2023-02-05 10:43 UTC
Requires
- xtompie/sorter: ^2.0
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; } }