eduluz1976/pervasive

库函数,用于封装类方法,并动态添加其他可调用对象,允许在方法之前或之后执行某些操作。

dev-master 2018-11-23 07:59 UTC

This package is auto-updated.

Last update: 2024-09-23 20:29:30 UTC


README

目的

pervasive 是一个库,允许封装对象并在某些方法(如 preposguard 事件)中注入一些行为。这允许动态测试自定义流程,而无需修改已投入生产的代码。

使用方法

示例

UserController 类为例,

<?php

class UserController {
    
    public function addNewUser() {
        // ...
    }
    
} 

此方法接收用户数据,进行验证,将其插入数据库,并向用户界面返回 JSON 消息以提供反馈。

假设我们想要检查该用户是否已存在于第三方服务提供商中,用服务提供商提供的另一个电子邮件地址替换已通知的电子邮件地址。

注意:假设有一个 Request 类的对象,该对象管理所有请求,并且可以在全局范围内访问。

在启动脚本和执行控制器请求的点之间的一些脚本中

<?php 

use \eduluz1976\pervasive\Builder;
use \eduluz1976\pervasive\Mock;

// Wrapping UserController into Builder 
Builder::design(UserController::class)
    ->_() // this calls the MockBuilder, that add dynamic behaviour on wrapped classes.
    ->addPreFunction(
        'addNewUser',
        function (Mock $container = null) {
            
            $email = Request::get('email');
            
            $newEmail = ExternalServiceProviderAPI::checkEmail($email);
            
            if ($newEmail) {
                Request::set('email', $newEmail);
            }            
        }
    );

 

执行控制器的文件中

<?php

// Getting a new instance of the wrapped class 
$controller = Builder::build ( UserController::class ) ;

$controller->addNewUser();