有人能解释一下InputFilterAwareInterface和InputFilterProviderInterface这两个接口的区别吗?两者似乎都用于同一目的,获得一个InputFilter,但我知道它们不能相同......它们什么时候被调用?
由于
答案 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中那样处理任何实例或类属性。