aura/html

提供HTML转义器和辅助工具,包括表单输入辅助工具。

2.6.0 2022-02-19 07:18 UTC

This package is auto-updated.

Last update: 2024-09-12 08:58:16 UTC


README

提供可以在任何模板、视图或展示系统中使用的HTML转义器和辅助工具,包括表单输入辅助工具。

前言

安装

此库需要PHP 5.3或更高版本,且已安装mbstring和/或iconv;我们原则上推荐使用最新可用的PHP版本。它没有用户空间依赖。

它可以通过Composer以aura/html的方式安装和自动加载。

或者,下载发行版或克隆此存储库,然后需要或包含其autoload.php文件。

质量

Scrutinizer Code Quality codecov Continuous Integration

要运行命令行中的单元测试,请发出composer install,然后在包根目录下发出vendor/bin/phpunit。这需要composer作为composer可用。

此库试图遵守PSR-1PSR-2PSR-4。如果您注意到遵守上的疏忽,请通过pull request发送补丁。

社区

要提问、提供反馈或以其他方式与Aura社区进行交流,请加入我们的Google Group,关注@auraphp或在我们Freenode的#auraphp上与我们聊天。

入门

使用HelperLocatorFactory是实例化包含所有可用辅助工具的HelperLocator的最简单方法。

<?php
$factory = new \Aura\Html\HelperLocatorFactory;
$helper = $factory->newInstance();
?>

内置辅助工具

一旦你有了HelperLocator,你就可以通过调用它们在HelperLocator实例上的方法来使用辅助工具。有关更多信息,请参阅标签辅助工具表单辅助工具页面。

注意:所有内置辅助工具都适当地转义值;有关更多信息,请参阅各种辅助类内部。

自定义辅助工具

添加自己的自定义辅助工具有两个步骤

  1. 编写一个辅助类

  2. HelperLocator中将该类的工厂设置为服务名

辅助类只需要实现__invoke()方法。我们建议从AbstractHelper扩展以访问缩进、转义等,但这不是必需的。

以下示例辅助类将ROT-13应用于字符串。

<?php
namespace Vendor\Package;

use Aura\Html\Helper\AbstractHelper;

class Obfuscate extends AbstractHelper
{
    public function __invoke($string)
    {
        return $this->escaper->html(str_rot13($input));
    }
}
?>

现在我们有了辅助类,我们将其工厂设置为HelperLocator中的服务名。在这里,我们创建并返回辅助类。

<?php
$helper->set('obfuscate', function () {
    return new \Vendor\Package\Obfuscate;
});
?>

HelperLocator中的服务名同时作为方法名。这意味着我们可以通过$this->obfuscate()调用辅助工具

<?= $helper->obfuscate('plain text') ?>

注意,我们可以为辅助工具使用任何服务名,尽管通常有用服务名命名辅助类,以及可以调用为方法的一个词。

请检查Aura\Html\Helper中的类以获取更复杂和强大的示例。

转义

在基于PHP的模板系统中,一个重要但较为繁琐的任务是正确地转义输出。从安全角度来看,正确转义输出是绝对必要的。本包提供了一个具有四种转义方法的escape()助手函数。

  • $this->escape()->html('foo')用于转义HTML值
  • $this->escape()->attr('foo')用于转义未加引号的HTML属性
  • $this->escape()->css('foo')用于转义CSS值
  • $this->escape()->js('foo')用于转义JavaScript值

以下是一些使用各种escape()助手函数的示例

<head>

    <style>
        body {
            color: <?= $this->escape()->css($theme->color) ?>;
            font-size: <?= $this->escape()->css($theme->font_size) ?>;
        }
    </style>

    <script language="javascript">
        var foo = "<?= $this->escape()->js($js->foo); ?>";
    </script>

</head>

<body>

    <h1><?= $this->escape()->html($blog->title) ?></h1>

    <p class="byline">
        by <?= $this->escape()->html($blog->author) ?>
        on <?= $this->escape()->html($blog->date) ?>
    </p>

    <div id="<?php $this->escape()->attr($blog->div_id) ?>">
        <?= $blog->raw_html ?>
    </div>

</body>

遗憾的是,escaper功能较为冗长,可能会使模板代码显得杂乱。有两种方法可以减轻这一问题。

第一种是将escape()助手函数赋值给一个变量,然后作为可调用对象来调用它。以下是一些使用各种转义方法作为可调用对象的示例

<?php
// assign the escaper helper properties to callable variables
$h = $this->escape()->html;
$a = $this->escape()->attr;
$c = $this->escape()->css;
$j = $this->escape()->js;
?>

<head>

    <style>
        body {
            color: <?= $c($theme->color) ?>;
            font-size: <?= $c($theme->font_size) ?>;
        }
    </style>

    <script language="javascript">
        var foo = "<?= $j($js->foo); ?>";
    </script>

</head>

<body>

    <h1><?= $h($blog->title) ?></h1>

    <p class="byline">
        by <?= $h($blog->author) ?>
        on <?= $h($blog->date) ?>
    </p>

    <div id="<?php $a($blog->div_id) ?>">
        <?= $blog->raw_html ?>
    </div>

</body>

或者,escape()助手函数所使用的Escaper类提供了四个静态方法来减少冗长和杂乱:h()a()c()j()。这些方法分别用于转义HTML内容值、未加引号的HTML属性值、CSS值和JavaScript值。

注意:在Aura中,我们通常避免使用静态方法。然而,我们认为减少模板杂乱的代价在这个例子中是值得的。

要在PHP模板中调用静态的Escaper方法,使用useEscaper作为短别名,然后在别名上调用静态方法。(如果您没有实例化一个HelperLocatorFactory,您需要通过调用Escaper::setStatic(new Escaper)来准备静态的escaper方法。)

以下是一些使用各种静态方法的示例

<?php use Aura\Html\Escaper as e; ?>

<head>

    <style>
        body {
            color: <?= e::c($theme->color) ?>;
            font-size: <?= e::c($theme->font_size) ?>;
        }
    </style>

    <script language="javascript">
        var foo = "<?= e::j($js->foo); ?>";
    </script>

</head>

<body>

    <h1><?= e::h($blog->title) ?></h1>

    <p class="byline">
        by <?= e::h($blog->author) ?>
        on <?= e::h($blog->date) ?>
    </p>

    <div id="<?php e::a($blog->div_id) ?>">
        <?= $blog->raw_html ?>
    </div>

</body>