Настройка входного фильтра Zend Framework 2 с помощью диспетчера подключаемых модулей

Я последовал примеру альбома zf2. Сейчас я пытаюсь интегрировать очиститель HTML.

Это модуль
https://github.com/juriansluiman/Soflomo-Purifier#injecting-the-filtermanager

Это способ, которым я построил мой входной фильтр.
http://framework.zend.com/manual/current/en/user-guide/forms-and-actions.html

namespace Album\Model;

// Add these import statements
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class Album implements InputFilterAwareInterface
{
public $id;
public $artist;
public $title;
protected $inputFilter;                       // <-- Add this variable

public function exchangeArray($data)
{
$this->id     = (isset($data['id']))     ? $data['id']     : null;
$this->artist = (isset($data['artist'])) ? $data['artist'] : null;
$this->title  = (isset($data['title']))  ? $data['title']  : null;
}

// Add content to these methods:
public function setInputFilter(InputFilterInterface $inputFilter)
{
throw new \Exception("Not used");
}

public function getInputFilter()
{
if (!$this->inputFilter) {
$inputFilter = new InputFilter();

$inputFilter->add(array(
'name'     => 'id',
'required' => true,
'filters'  => array(
array('name' => 'Int'),
),
));

$inputFilter->add(array(
'name'     => 'artist',
'required' => true,
'filters'  => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name'    => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min'      => 1,
'max'      => 100,
),
),
),
));

$inputFilter->add(array(
'name'     => 'title',
'required' => true,
'filters'  => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name'    => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min'      => 1,
'max'      => 100,
),
),
),
));

$this->inputFilter = $inputFilter;
}

return $this->inputFilter;
}
}

Я получаю следующую ошибку.

Таким образом, вы получаете ServiceNotFoundException: Zend \ Filter \ FilterPluginManager :: get не удалось получить или создать экземпляр для htmlpurifier. Это означает, что менеджер плагина фильтра был лениво создан и не знает о плагине htmlpurifier.

Как правильно построить мой входной фильтр, чтобы воспользоваться этим модулем? Большое спасибо,
Matt

1

Решение

Проблема, которую вы испытываете, вызвана именно тем, что отмечено в SoflomoPurifier документация:
так как вы вручную создаете new InputFilterэтот экземпляр никогда не связывается с конфигурацией, предоставляемой дополнительными модулями.

Чтобы убедиться, что это проводка происходит, я бы предложил создать новую InputFilter подкласс и положить все InputFilter::add() призывает в его init() метод:

use Zend\InputFilter\InputFilter:

class AlbumInputFilter extends InputFilter
{
public function init()
{
$this->add(array(
'name'     => 'id',
'required' => true,
'filters'  => array(
array('name' => 'Int'),
),
));

$this->add(array(
'name'     => 'artist',
'required' => true,
'filters'  => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name'    => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min'      => 1,
'max'      => 100,
),
),
),
));

$this->add(array(
'name'     => 'title',
'required' => true,
'filters'  => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name'    => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min'      => 1,
'max'      => 100,
),
),
),
));
}
}

измените конструктор модели вашего альбома, чтобы использовать инжектор конструктора:

use Zend\InputFilter\InputFilterInterface;

class Album
{
// etc etc

public function __construct(InputFilterInterface $inputFilter)
{
$this->inputFilter = $inputFilter;
}

// etc etc
}

а затем использовать фабрику, чтобы ввести его:

// in your Module.php

public function getServiceConfig()
{
return [
'factories' => [
'AlbumFactory' => function($serviceManager) {
$inputFilterManager = $serviceManager->get('InputFilterManager');
return function() use ($inputFilterManager) {
$inputFilter = $inputFilterManager->get(AlbumInputFilter::class);
return new Album($inputFilter)
}
}
]
];
}

ссылающееся InputFilterPluginManager::get() с входным фильтром FQCN автоматически вызывает его конструктор, связывает его с другими модулями, а затем вызывает его init() метод.

так что теперь, вместо того, чтобы использовать $album = new Album, вы должны использовать AlbumFactory Сервис для создания альбомов с правильно введенным фильтром ввода:

$createAlbum = $serviceManager->get('AlbumFactory');
$album = $createAlbum()

Очевидно, что вам рекомендуется внедрять эту фабрику внутри любого потребителя (например, контроллеров) вместо того, чтобы извлекать ее из менеджера сервисов, и, возможно, реорганизовать анонимную функцию в выделенный фабричный класс.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]