saeven / zf2-purifier

HTML Purifier作为过滤器和视图辅助工具,用于Zend Framework 2.5

0.1.2 2015-07-13 14:32 UTC

This package is auto-updated.

Last update: 2024-08-29 04:45:43 UTC


README

Soflomo\Purifier是HTMLPurifier在Zend Framework 2中的集成。它提供了一个Zend\Filter\FilterInterface实例,因此您可以直接使用Soflomo\Purifier通过您的Zend\InputFilter类来过滤HTML输入。此外,还提供了一个视图辅助工具,以帮助在视图脚本中即时净化HTML。

安装

Soflomo\Purifier通过composer提供。将"soflomo/purifier"添加到您的composer.json列表中。您可以指定Soflomo\Purifier的最新稳定版本。

"soflomo/purifier": ">=0.1.0"

要在您的config/application.config.php文件中启用模块,请将Soflomo\Purifier添加到已启用模块的列表中。

使用方法

在您的输入过滤器配置中,添加htmlpurifier过滤器以过滤结果。示例表单

namespace Application\Form;

use Zend\InputFilter;
use Zend\Form\Form;

class Foo extends Form implements
    InputFilter\InputFilterProviderInterface
{
    public function __construct($name = null)
    {
        parent::__construct($name);

        $this->add(array(
            'name'    => 'title',
            'options' => array(
                'label' => 'Title'
            ),
        ));

        $this->add(array(
            'name'    => 'text',
            'options' => array(
                'label' => 'Text'
            ),
            'attributes' => array(
                'type'  => 'textarea',
            ),
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'title' => array(
                'required' => true,
                'filters'  => array(
                    array('name' => 'stringtrim'),
                ),
            ),
            'text'  => array(
                'required' => true,
                'filters'  => array(
                    array('name' => 'stringtrim'),
                    array('name' => 'htmlpurifier'),
                ),
            ),
        );
    }
}

如果您的表单有过滤器插件管理器注入,则应该可以正常工作。如果没有,请参阅如何注入过滤器插件管理器

当您无法过滤插入到数据库中的HTML时,您可能需要在视图中过滤HTML。请注意,HTMLPurifier不是一个非常快的库,因此对每个请求进行过滤可能会成为显著的性能瓶颈。建议使用缓存机制来缓存过滤后的HTML输出。视图辅助工具在键htmlPurifier下可用

<?php echo $this->htmlPurifier()->purify($foo->getText())?>

还有简写可用

<?php echo $this->htmlPurifier($foo->getText())?>

注入过滤器管理器

如果您使用new FormClass实例化表单,则过滤器插件管理器不会被注入。因此,您会得到一个ServiceNotFoundException:"Zend\Filter\FilterPluginManager::get无法获取或创建htmlpurifier实例"。这意味着过滤器插件管理器不了解htmlpurifier插件。

您可以通过从服务管理器获取过滤器插件管理器并将其手动注入到表单中来修复此问题

use Zend\Filter\FilterChain;

$form    = new MyForm;

// $sl is the service locator
$plugins = $sl->get('FilterManager');
$chain   = new FilterChain;
$chain->setPluginManager($plugins);

$form->getFormFactory()->getInputFilterFactory()->setDefaultFilterChain($chain);

Soflomo\Common有一个用于注入过滤器管理器的实用类。如果您通过composer需要soflomo\common,则可以将上述代码替换为以下行

use Soflomo\Common\Form\FormUtils;

$form = new MyForm;

// $sl is the service locator
FormUtils::injectFilterPluginManager($form, $sl);

提高性能

HTMLPurifier不是最快的库,但它是PHP中过滤HTML最安全的库。默认情况下,HTMLPurifier使用大量的类,所有文件的所有权包括在自动加载期间会减慢性能。您可以创建HTMLPurifier类的独立版本,其中单个文件包含大多数类。

位于vendor/bin/purifier-generate-standalone的脚本为您生成此文件。独立文件创建在vendor/ezyang/htmlpurifier/library内(对此无需进行任何配置),因此请确保您可以写入该目录。Soflomo\Purifier库通过配置选项soflomo_prototype.standalone帮助您使用此独立版本。在您的config/autoload/local.php

return array(
    'soflomo_purifier' => array(
        'standalone' => true,
    ),
);

如果您的composer没有将库加载到vendor/中,您也可以更新到独立版本的路径

return array(
    'soflomo_purifier' => array(
        'standalone'      => true,
        'standalone_path' => 'something-else/ezyang/htmlpurifier/library/HTMLPurifier.standalone.php',
    ),
);

配置HTMLPurifier

HTMLPurifier有一个名为HTMLPurifier_Config的类,您可以通过它配置净化规则。大多数配置规则都是基于键/值对的:`$config->set('HTML.Doctype', 'HTML 4.01 Transitional');`。此映射已复制到Zend Framework 2配置文件中,因此您可以轻松修改HTMLPurifiers配置

return array(
    'soflomo_purifier' => array(
        'config' => array(
            'HTML.Doctype' => 'HTML 4.01 Transitional'
        ),
    ),
);