Разница между 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.

Другие вопросы по тегам