jgswift/kfiltr

PHP 5.5+ 过滤模式实现

0.1.2 2014-09-11 04:10 UTC

This package is not auto-updated.

Last update: 2024-10-03 01:48:29 UTC


README

PHP 5.5+ 过滤模式实现

Build Status Scrutinizer Code Quality Latest Stable Version License Coverage Status

安装

使用 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);