Разница между InputFilterAwareInterface и InputFilterProviderInterface в ZF2
Может кто-нибудь объяснить мне разницу между обоими интерфейсами InputFilterAwareInterface и InputFilterProviderInterface? Кажется, что оба служат одной и той же цели - получить InputFilter, но я знаю, что они не могут быть одинаковыми... И когда их вызывают?
Спасибо
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 также предоставляет множество возможностей для часто используемых интерфейсов. Например InputFilterAwareTrait для InputFilterInterface. Это означает, что вы можете легко реализовать этот интерфейс, если у вас 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.