lapaz / odango

AOP 启发型的建议/函数组合器

0.2.0 2018-09-05 07:48 UTC

This package is auto-updated.

Last update: 2024-09-06 09:14:13 UTC


README

Build Status

Odango 是一个受面向方面编程(AOP)启发的函数组合器。

即使你不了解 AOP,分离关注点也是更好的实践,例如缓存、日志、事务、安全过滤器、事件分发等。横切关注点应从你的业务逻辑中分离出来。

这不是一个 AOP 编织框架。如果你想使用类似 Google Guice 的完整功能的 AOP,我更推荐使用 Ray.Aop。

示例

$withLoggedTransaction = AdviceComposite::of(
    function ($invocation) use ($logger) {
        $logger->info('Starting transaction.');
        $result = $invocation->proceed();
        $logger->info('Transaction comitted.');
        return $result;
    }
)->with(
    function ($invocation) use ($db) {
        $db->beginTransaction();
        try {
            $result = $invocation->proceed();
            $db->commit();
            return $result;
        } catch (\Exception $ex) {
            $dbh->rollBack();
            throw $ex;
        }
    }
);

$storeDataInvocation = [$this, 'storeData']; // Some callable
$storeDataInvocation = $withLoggedTransaction->bind($storeDataInvocation);

$storeDataInvocation($data);

Odango 支持将 Ray.Aop 的 MethodInterceptor 作为组合目标。因此,现有的 AOP 资产可以重用。

注意,由于生成的函数引用了创建上下文,AdviceComposite 实例是不可变的。修改它会破坏它。

已知问题

Joinpoint::getThis()Joinpoint::getMethod() 抛出 BadMethodCallException,因为没有绑定对象上下文。