使用插件管理器配置 Zend Framework 2 输入过滤器
Configure Zend Framework 2 Input Filter Using Plugin Manager
我已经按照 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 插件。
构造我的输入过滤器以利用此模块的正确方法是什么。非常感谢,
马特
您遇到的问题完全是由 SoflomoPurifier
文档中指出的内容引起的:
由于您使用 new InputFilter
手动实例化,因此该实例永远不会与其他模块提供的配置相关联。
为了确保这种连接发生,我建议创建一个新的 InputFilter
subclass 并将所有 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,
),
),
),
));
}
}
更改您的 Album 模型构造函数以使用构造函数注入:
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()
显然建议您将此工厂注入任何消费者(即控制器)而不是从服务管理器中拉取它,并且可能将匿名函数重构为专用工厂class。
我已经按照 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 插件。
构造我的输入过滤器以利用此模块的正确方法是什么。非常感谢, 马特
您遇到的问题完全是由 SoflomoPurifier
文档中指出的内容引起的:
由于您使用 new InputFilter
手动实例化,因此该实例永远不会与其他模块提供的配置相关联。
为了确保这种连接发生,我建议创建一个新的 InputFilter
subclass 并将所有 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,
),
),
),
));
}
}
更改您的 Album 模型构造函数以使用构造函数注入:
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()
显然建议您将此工厂注入任何消费者(即控制器)而不是从服务管理器中拉取它,并且可能将匿名函数重构为专用工厂class。