jtolj/html-attributes

此包已被废弃,不再维护。未建议替代包。

PHP中处理HTML属性的流畅接口。

v2.1.0 2020-10-01 14:02 UTC

This package is auto-updated.

Last update: 2024-02-16 16:46:29 UTC


README

PHP中处理HTML属性的流畅接口

此包提供了一个简单的类,灵感来源于 Drupal 的 Drupal\Core\Template\Attribute,旨在帮助以结构化的方式管理 HTML 属性。

我主要在 Laravel 中使用它,因此下面的伪代码示例使用了 Laravel 习惯。然而,此包并不仅限于 Laravel,可以在没有它的环境中使用。

示例

在控制器中

use App\Post;
use Jtolj\HtmlAttributes\HtmlAttributes;

$post = Post::find(1);
$post->is_wide = true;
$attributes = new HtmlAttributes();
$attributes
    ->addClass('card');
    ->setAttribute('id', "post-{$post->id}");
$attributes->addClassIf('card--wide', $post->is_wide);

echo "<div $attributes>$post->escaped_content</div>"

输出

<div class="card card--wide" id="post-1">Hello World</div>

使用示例特质与 Eloquent 模型和 Blade 模板

namespace App;

use Illuminate\Database\Eloquent\Model;
use Jtolj\HtmlAttributes\Traits\HasHtmlAttributes;
class Post extends Model
{
    use HasHtmlAttributes;
}
@foreach ($posts as $post)
    <div {!! $post->htmlAttributes()->addClass('card')->addClassIf('even', $loop->even) !!}>
    {{ $post->summary }}
    </div>
@endforeach

输出

<div class="card">First Post</div>
<div class="card even">Second Post</div>
<div class="card">Third Post</div>

转义和过滤

使用 laminas/laminas-escaper 包执行属性名称和值的转义。属性键使用 escapeHtmlAttr() 方法进行转义。从 2.0 版本开始,属性值使用 escapeHtml() 方法进行转义。

此外,默认情况下,以 'on' 开头的属性名称(JavaScript 事件处理器)不会输出。

您可以使用 setUnsafePrefixes(array $prefixes) 方法设置您自己的前缀列表。以这些前缀开头的属性名称将在输出时被删除。

您还可以通过调用 allowUnsafe() 来关闭此行为。这将不会在输出之前过滤属性名称列表,并将 'unsafe' 属性的值完全未转义地输出(自 2.0 版本起)。请务必小心处理此行为,以防止 XSS 攻击。

use Jtolj\HtmlAttributes\HtmlAttributes;

$attributes = new HtmlAttributes;
$attributes->addClass('card');
$attribute->setAttribute('onclick', 'alert("Hello";)');

$safe_string = (string) $attributes;
//class="card"

$attributes->allowUnsafe();
$unsafe_string = (string) $attributes;
//class="card" onclick="alert(\"Hello\";)"