【问题标题】:Efficient way to handle multiple HTMLPurifier configs处理多个 HTMLPurifier 配置的有效方法
【发布时间】:2010-04-06 01:12:32
【问题描述】:

我在当前项目中使用 HTMLPurifier,但我不确定处理多个配置的最有效方法。在大多数情况下,唯一的主要变化是允许的标签。

目前,我在每个使用 HTMLPurifier 的类中都有一个私有方法,当需要配置时调用该方法并从默认值创建一个。我对此并不满意,好像 2 个类使用相同的配置,这是重复代码,如果一个类需要 2 个配置怎么办?只是感觉很乱。

它的一个好处是它很懒惰,因为它在需要之前不会创建任何东西。可以使用各种类,而不必净化任何东西。所以我不想创建一堆甚至可能不会被使用的配置对象。

我最近发现你可以创建一个新的 HTMLPurifier 实例并直接设置配置选项,如下所示:

$purifier = new HTMLPurifier();
$purifier->config->set('HTML.Allowed', '');

我不确定这是否是不好的形式,如果不是,我也不确定使用它的好方法。

我最近的想法是创建一个配置处理程序类,它只返回一个 HTMLPurifier 配置以用于后续的 purify 调用。在某些时候,它可能会被扩展以允许设置配置,但从一开始我就认为它们只是被硬编码并通过开关运行方法参数来获取请求的配置。也许我可以将存储的净化器实例作为参数发送,并让方法直接在其上设置配置,如上所示?

这对我来说似乎是我想到的几种方法中最好的,但我不确定这样的任务是否需要我创建一个类来处理它,如果是这样,我是否以最好的方式处理它.

我不太熟悉 HTMLPurifier 的内部工作原理,所以我不确定是否有更好的机制来处理多个配置。

感谢任何人提供的任何见解。

【问题讨论】:

    标签: php configuration htmlpurifier


    【解决方案1】:

    配置对象有一个重要的不变性:在它们被用于执行净化之后,它们就不能被编辑。您可能对类具有的一些convenience methods 感兴趣,特别是inherit,您可以使用loadArray 加载值数组。

    【讨论】:

    • 啊,谢谢,不知道一旦使用配置就无法编辑。这使得我展示的那一点不可行。 -- 这些方法似乎使创建配置更方便,尽管我在管理和使用它们时更寻求便利。 ——对最好的解决方法有什么想法吗?谢谢。
    • 嗯,你可以通过将旧的配置对象传递给构造函数来廉价地创建另一个配置对象。
    • 我正在寻找更多与我在答案中发布的内容相同的内容。我真的没有创建配置的问题,没关系。我一直在寻找其他人如何处理管理几个不同的配置,以及是否有任何内置机制可以使此类任务更加简化。 - 感谢您的回答和评论。它帮助我意识到我正在尝试做的一些事情。
    【解决方案2】:

    我刚刚编写了一个快速、简单的配置处理程序类。

    您可以查看/使用它@http://gist.github.com/358187/

    在初始化时需要一个配置数组。

    $configs = array(
      'HTML.Doctype' => 'HTML 4.01 Strict',
    
      'posts' => array(
        'HTML.Allowed' => 'p,a[href],img[src]'
      ),
      'comments' => array(
        'HTML.Allowed' => 'p'
      ),
    
      'default' => array(
        'HTML.Allowed' => ''
      )
    );
    

    直接放入数组的指令是全局的,将应用于所有配置。如果在命名配置中设置了相同的指令,则将使用命名配置中的值。

    然后你可以像这样获取配置:

    $purifierConfig = new purifierConfig($configs);
    $commentsConfig = $purifierConfig->getConfig('comments');
    

    或者,简写:

    $commentsConfig = $purifierConfig['comments'];
    

    如果请求的配置不存在或调用中没有指定配置,则返回默认配置。

    我可能会在某个时候充实它,但现在这行得通。

    我一直在寻找人们如何在他们的项目中处理此类事情,或者是否有任何内置机制使此类事情变得更加精简,但我想我的问题范围有点太窄了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多