bjuppa/metatagbag

HTML meta 标签的便捷集合

v1.1.3 2021-03-21 11:04 UTC

This package is auto-updated.

Last update: 2024-09-21 18:59:55 UTC


README

一个用于收集和操作在 HTML meta 标签 的 PHP 类,在输出到 <head> 元素之前进行。与 Laravel 兼容良好,也可独立使用。

灵感来源于 Laravel 的 MessageBag

composer require bjuppa/metatagbag

目录

创建 MetaTagBag

use Bjuppa\MetaTagBag\MetaTagBag;

$bag = new MetaTagBag(
  ['name' => 'description', 'content' => 'A description'],
  ['name' => 'keywords', 'content' => 'key,words']
);

// ...or using a static creator:

$bag = MetaTagBag::make(
  ['name' => 'description', 'content' => 'A description'],
  ['name' => 'keywords', 'content' => 'key,words']
);

输入格式

所有在某种形式的 meta 标签列表上操作的方法都将接受几乎任何类型的类似映射(键值)输入,可选地嵌套在某些类型的列表中。

标签可以单独作为参数传递

最简洁的语法可以在上面的创建示例中看到,其中提供了多个标签,每个标签都作为方法的一个单独参数提供。

标签列表将被展开

如果遇到某种类型的嵌套列表,它将被展开,使得任何缺少 "string" 键的项将成为结果中 一维 标签列表中的单独标签。

$bag = new MetaTagBag(
  [
    ['name' => 'description', 'content' => 'A description'],
    ['name' => 'keywords', 'content' => 'key,words'],
    [
      ['name' => 'nested', 'content' => 'This will end up in the top-level with the other tags'],
    ]
  ]
);

Json 字符串将被反序列化

如果提供的列表中遇到字符串,将尝试将其从 json 反序列化。

MetaTagBag::make('[{"name":"description","content":"A description"},{"name":"keywords","content":["key","words"]}]');

对象将被转换为数组

如果提供的列表中遇到对象,它将被转换为数组,并合并到展开的列表中。实现了 Laravel 的 Arrayable,如 Laravel 的 Collection 和其他 MetaTagBag,将正常工作。实现了 Bjuppa\MetaTagBag\Contracts\MetaTagProvider 的将提取该实例的 MetaTagBag

MetaTagBag::make(new MetaTagBag(['name' => 'description', 'content' => 'A description']));

HTML 输出

MetaTagBag 应通常在 <head> 元素中首先渲染,在其他元素如 <title> 之前。这是因为它可能包含一个 charset meta 标签,该标签应该在任何其他内容之前。

// Return a string of HTML tags from the bag's contents
$bag->toHtml();

MetaTagBag 实现 Laravel 的 Htmlable 协议,因此在一个 Blade 模板 中,您可以通过将任何实例放在大括号中来输出标签。

<head>
{{ Bjuppa\MetaTagBag\MetaTagBag::make(['name' => 'description', 'content' => 'A description']) }}
<title>Page title</title>
</head>

MetaTagBag 转换为 string 也会输出 HTML 表示形式

echo $bag; //Implicit string casting
$html = (string) $bag; //Explicit string casting

逗号分隔的列表属性输出

对于 HTML,任何数组属性都将被压缩为一个逗号分隔的列表。例如,这可以与 name="keywords" meta 标签一起使用,其中 content 属性中的关键字可以被视为一个列表,直到渲染时为止。

添加标签

add(...$tags) 方法将修改 MetaTagBag 实例,添加提供的任何标签,而不检查重复。

merge(...$tags) 方法也将修改 MetaTagBag 实例,但会覆盖任何具有相同 namehttp-equivitempropproperty 属性的现有标签。

合并数组属性

如果要合并的标签具有作为其content属性的数组,则该数组将与包中任何现有匹配标签的content合并。例如,可以与name="keywords"元标签一起使用,其中可能想要添加关键词,而不是覆盖它们。

删除标签

forget(...$attributes)方法将从MetaTagBag实例中删除所有匹配的标签。

过滤标签

match(...$attributes)方法可用于将匹配的标签过滤到新的MetaTagBag中。

unique()方法返回一个新的MetaTagBag,其中已删除所有重复的标签(保留最后添加的)。

此外,如果使用参数调用unique(...$attributes),则匹配的标签在返回的MetaTagBag中只会出现一次(也保留最后添加的)。

检查 MetaTagBag

count(...$attributes)has(...$attributes)方法可用于计算匹配的标签或检查包中是否存在任何匹配的标签。当然,可以不带参数调用count()以返回包中标签的总数,而调用不带参数的has()将始终返回false

content($attributes)方法将提取最后一个匹配标签的content属性的。它是getLastMatchingAttributeValue($attributeToGet, $attributesToMatch)的包装器,用于获取任何属性的相同功能。

排序标签

不带参数调用的sort()方法将返回一个新的MetaTagBag实例,其中首先放置charsethttp-equiv="X-UA-Compatible"标签。

如果提供回调函数,它将像PHP的uasort参数一样使用。

可选操作

pipe(callable $callback)方法将MetaTagBag传递给给定的回调函数,并返回结果。例如,它可以用来自动检查MetaTagBag是否包含某些标签,如果是,则添加或删除其他标签。

转换为 json

MetaTagBagJsonSerializable,因此可以直接将其提供给PHP的json_encode()函数。此外,由于MetaTagBag实现了Laravel的Jsonable合同,因此还存在toJson()方法。

其他包

对于Laravel应用程序中元标签的更完整的解决方案,您应查看butschster/LaravelMetaTags