stvkoch/lazyresult

延迟调用对象的代理

dev-master 2014-05-21 10:32 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:42:04 UTC


README

LazyResult 是一种代理设计,仅在预期结果与循环结构交互或当您的代码尝试访问结果属性时调用已注册对象的函数。此外,您还可以配置前后回调,例如使用缓存管理器结果。

LazyResult 可以以多种方式帮助您的项目,您可以使用 LazyResult 来操作缓存,延迟调用常见动作控制器。

[Build Status LazyResult stvkoch by travis-ci]

示例

代理延迟调用一个函数或回调

$lazyObject = new \Lazy\Result(array('Model', 'find'));
$lazyResult = $lazyObject(array('id'=>1)); //not run yeat
....
foreach($lazyResult as $value) { //in first interation find method is call!
    ....
}

代理延迟调用对象

$lazyObject = new \Lazy\Result(array('Model'));
$lazyResult = $lazyObject->find(array('id'=>1)); //not run yeat
....
foreach($lazyResult as $value) { //in first interation find method is call!
    ....
}

代理延迟调用对象/带缓存的函数

$lazyObject = new \Lazy\Result(array('Model'), array('Cache','get'), array('Cache','set'));
$lazyResult = $lazyObject->find(array('id'=>1)); //not run yeat
....
foreach($lazyResult as $value) { //in first interation find method is call! but before Cache::get is run, if Cache::get not return result 'find' method is run and after Cache::set with array('id'=>1) more $result
    ....
}

访问延迟结果的值的途径

您可以通过交互循环、访问原始结果对象的属性或调用 LazyResult 对象的 result() 方法来访问 LazyResult 对象的结果。

class Model{
    static function words(){
        return 'LazyResult from model';
    }
    static function one($id){
        return (object) array('id'=>$id, 'name'=>'Steven Koch', 'country'=>'Portugal');
    }
    static function all(){
        return array(
            (object) array('id'=>'1', 'name'=>'Steven Koch', 'country'=>'Portugal'),
            (object) array('id'=>'2', 'name'=>'Joan Rodrigues', 'country'=>'France'),
            (object) array('id'=>'3', 'name'=>'Hans De Groot', 'country'=>'Netherlands')
        );
    }
    
}
//..
$lazyObject = new \Lazy\Result(array('Model'));
$lazyResult = $lazyObject->one(1); //not run yeat
echo $lazyResult->name; //now is call one on Model
//...
$lazyResult = $lazyObject->all(); //not run yeat
$arrayResult = $lazyResult->result(); //now is call one on Model
//or...
foreach($lazyResult as $item){
    echo $item->name;
}
//...
$lazyResult = $lazyObject->words(); //not run yeat
echo "".$lazyResult; //now is call one on Model and return result from __toString

定义

[$object] new \Lazy\Result(array $callableLazy [, array $beforeCallableLazy] [, array $afterCallableLazy]);

$callableLazy

\Lazy\Result 对象将 $callableLazy 注册为在调用 result() 函数时执行。在 \Lazy\Result 对象中,result() 公共方法在初始化 foreach 循环结构时运行。

$callableLazy 接收您为代理对象传递的参数

示例

$lazyFunc = function($param1, $param2){...};
$lazyObject = new \Lazy\Result($lazyFunc);
$lazyObject($param1, $param2);

$beforeCallableLazy

当定义时,$beforeCallableLazy 在 $callableLazy 之前运行。如果您想为结果添加缓存管理器,这很有用。

您需要实现的 $beforeCallableLazy 接口

boolean $beforeCallableLazy(array $parameters, $callableLazy);

$afterCallableLazy

当定义时,$afterCallableLazy 在 $callableLazy 之后运行。如果您想将结果设置在缓存管理器中,这很有用。

您需要实现的 $afterCallableLazy 接口

boolean $afterCallableLazy(array $parameters, $callableLazy, array $resultByCallableLazy);

函数

result()

Result obejct 函数运行 callableLazy。当在循环结构中使用 resultLazy 时,循环结构在第一次迭代中运行 result 函数并从回调中接收值。在某些情况下,您可能希望调用 result() 来从回调中接收延迟值,或在没有循环结构的情况下调用回调。

配置全局前后回调

您可能希望配置前后回调以在代理每次调用延迟回调时运行。

\Lazy\Result::$globalBeforeCallback = array('Cache', 'get');
\Lazy\Result::$globalAfterCallback = array('Cache', 'set');

现在所有代理创建都使用这些钩子回调。

测试

phpunit .

有任何问题!