jgswift / kfiltr
PHP 5.5+ 过滤模式实现
0.1.2
2014-09-11 04:10 UTC
Requires
- php: >=5.5
Requires (Dev)
- jgswift/qtil: 0.1.*
- phpunit/phpunit: 3.7.*
Suggests
- jgswift/qtil: 0.1.*
This package is not auto-updated.
Last update: 2024-10-03 01:48:29 UTC
README
PHP 5.5+ 过滤模式实现
安装
使用 composer 通过命令行安装
php composer.phar require jgswift/kfiltr:0.1.*
通过 composer.json 使用 composer 安装
{
"require": {
"jgswift/kfiltr": "0.1.*"
}
}
描述
Kfiltr 提供了一套通用的特性,以域无关的方式处理过滤、映射和钩子。
还提供了接口来广泛描述预期的实现,但使用此包需要这些接口。
依赖
- php 5.5+
用法
过滤器
一个最小的过滤器示例。执行方法不强制任何特定的签名,可以定义所需的任何参数
<?php class MyFilter implements kfiltr\Interfaces\Filter { use kfilter\Filter; function execute() { return func_get_arg(0); } } $filter = new MyFilter(); var_dump($filter('foo')); // returns 'foo'
委托
实际上,过滤器与委托相同,但过滤器可以通过自定义可调用对象绕过。
<?php $filter = new MyFilter(); $filter->setDelegate(function() { return 'bar'; }); var_dump($filter('foo')); // returns 'bar'
映射器
类似于上面的过滤器方法,映射方法专门用于使用输入数据填充已实例化的对象。使用映射器需要 jgswift/qtil
<?php class MyFactory { use qtil\Factory; } class MyMapper { use kfiltr\Mapper; function __construct(MyFactory $factory) { $this->setFactory($factory); } // do stuff to map object here. function map($input,$object) { return $object; } } class MyMiscClass { } $mapper = new MyMapper(new MyFactory()); $object = $mapper([],'MyMiscClass'); var_dump($object); // returns blank MyMiscClass object
如果没有提供 map 方法,则将使用默认的映射回调。默认映射回调假定输入是数组,对象是对象。
钩子
为了协助过滤处理,提供了一个标准的钩子实现。钩子是多个过滤器的容器,通常按顺序运行。钩子也可以是过滤器,但默认情况下不是。在下面的示例中,钩子将遍历并执行所有包含的过滤操作。
<?php // the same filter class from above class MyFilter implements kfiltr\Interfaces\Filter { use kfilter\Filter; function execute() { return func_get_arg(0); } } class MyHook implements kfiltr\Interfaces\Filter, kfiltr\Interfaces\Hook { use kfiltr\Hook, kfiltr\Filter; // this will execute all filters in order and return an array containing all results function execute() { $filters = $this->getFilters(); $results = []; if(!empty($filters)) { foreach($filters as $filter) { $results[] = call_user_func_array($filter,func_get_args()); } } return $results; } } $filter = new MyFilter(); $hook = new MyHook(); $hook->addFilter($filter); var_dump($hook('foo')); // returns [ 0 => 'foo' ]
工厂过滤器/映射器
过滤器
使用此过滤器需要 jgswift/qtil
工厂过滤器使用类映射创建对象。参数传递给构造函数
namespace Creatures { class Animal { function __construct($species) { /* ... */ } } class Human extends Animal { function __construct($ethnicity) { /* ... */ } } } class MyFilter { use kfiltr\Factory\Filter; } // specific class names keyed by an id $mapping = [ 'animal' => 'Creatures\Animal', 'human' => 'Creatures\Human' ]; $filter = new MyFilter(); // create filter $filter->setMapping($mapping); // apply mapping $animal = $filter(['cat'],'animal'); // create animal $human = $filter(['polish'],'human');// create human var_dump(get_class($animal)); // Creatures\Animal var_dump(get_class($human)); // Creatures\Human
映射器
此过滤器使用工厂创建对象,并使用 kfiltr\Mapper 映射属性。参数被映射,并且对于映射的类,构造函数必须为空。要映射具有非空构造函数的对象,需要自定义工厂。使用此过滤器需要 jgswift/qtil
namespace Creatures { class Animal { function __construct($species) { /* ... */ } } class Human extends Animal { function __construct($ethnicity) { /* ... */ } } } class MyFactory { use qtil\Factory; } class MyMapper { use kfiltr\Factory\Mapper; } $mapping = [ 'animal' => 'Creatures\Animal', 'human' => 'Creatures\Human' ]; $mapper = new MyMapper(); $mapper->setFactory(new MyFactory); $mapper->setMapping($mapping); $caucasian = $mapper(['ethnicity'=>'caucasian'],'human'); $indian = $mapper(['ethnicity'=>'indian'],'human'); $elephant = $mapper(['species'=>'elephant'],'animal'); var_dump($caucasian->ethnicity); var_dump($indian->ethnicity); var_dump($elephant->species);