使用插件管理器配置 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。