aura / html
提供HTML转义器和辅助工具,包括表单输入辅助工具。
Requires
- php: >=5.3.0
Requires (Dev)
- yoast/phpunit-polyfills: ~1.0
README
提供可以在任何模板、视图或展示系统中使用的HTML转义器和辅助工具,包括表单输入辅助工具。
前言
安装
此库需要PHP 5.3或更高版本,且已安装mbstring
和/或iconv
;我们原则上推荐使用最新可用的PHP版本。它没有用户空间依赖。
它可以通过Composer以aura/html的方式安装和自动加载。
或者,下载发行版或克隆此存储库,然后需要或包含其autoload.php文件。
质量
要运行命令行中的单元测试,请发出composer install
,然后在包根目录下发出vendor/bin/phpunit
。这需要composer
作为composer
可用。
此库试图遵守PSR-1、PSR-2和PSR-4。如果您注意到遵守上的疏忽,请通过pull request发送补丁。
社区
要提问、提供反馈或以其他方式与Aura社区进行交流,请加入我们的Google Group,关注@auraphp或在我们Freenode的#auraphp上与我们聊天。
入门
使用HelperLocatorFactory是实例化包含所有可用辅助工具的HelperLocator的最简单方法。
<?php $factory = new \Aura\Html\HelperLocatorFactory; $helper = $factory->newInstance(); ?>
内置辅助工具
一旦你有了HelperLocator,你就可以通过调用它们在HelperLocator实例上的方法来使用辅助工具。有关更多信息,请参阅标签辅助工具和表单辅助工具页面。
注意:所有内置辅助工具都适当地转义值;有关更多信息,请参阅各种辅助类内部。
自定义辅助工具
添加自己的自定义辅助工具有两个步骤
-
编写一个辅助类
-
在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方法,使用use
将Escaper作为短别名,然后在别名上调用静态方法。(如果您没有实例化一个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>