ZF2中InputFilterAwareInterface和InputFilterProviderInterface之间的区别

时间:2014-07-13 19:34:10

标签: zend-framework2 zend-form zend-validate zend-inputfilter

有人能解释一下InputFilterAwareInterface和InputFilterProviderInterface这两个接口的区别吗?两者似乎都用于同一目的,获得一个InputFilter,但我知道它们不能相同......它们什么时候被调用?

由于

1 个答案:

答案 0 :(得分:1)

两个接口都存在用于不同目的。 InputFilterAwareInterface保证实现的类具有setInputFilter()getInputFilter()方法,这些方法在必要时接受并返回InputFilter实例。另一方面,InputFilterProviderInterface仅保证实现的类将具有getInputFilterSpecification()方法,该方法返回过滤器规范(配置数组),该规范可以在各种输入工厂中用作参数。

例如;下面的代码段来自Zend\Form\Form.php类:

if ($fieldset === $this && $fieldset instanceof InputFilterProviderInterface) {
    foreach ($fieldset->getInputFilterSpecification() as $name => $spec) {
        $input = $inputFactory->createInput($spec);
        $inputFilter->add($input, $name);
    }
}

正如您所看到的,Form类使用给定的规范创建输入并将它们绑定到相关的过滤器,该规范由实现类的getInputFilterSpecification()方法返回(本例中为$ fieldset int)。

使用特征

Zend Framework 2还为常用接口提供了许多特性。例如,对于InputFilterInterface,InputFilterAwareTrait。这意味着,如果您有PHP> = 5.4

,则可以轻松实现该接口
namespace MyNamespace;

use Zend\InputFilter\InputFilterInterface;

MyClass implements InputFilterInterface {

    // Here is the trait which provides set and getInputFilter methods
    // with a protected $inputFilter attribute to all MyClass instances.

    use \Zend\InputFilter\InputFilterAwareTrait;

    // Your other methods.
    ...
}

现在,您可以在代码中的任何位置执行此操作:

$myClass->setInputFilter($AnInputFilterInstance);
$myClass->getInputFilter(); // Returns an inputfilter instance.

可以想象,InputFilterProviderInterface不存在特征,因为它的职责只是返回一个有效的配置规范。它不会像处理InputFilterInterface中那样处理任何实例或类属性。