bjuppa / metatagbag
HTML meta 标签的便捷集合
Requires
- php: ^7.1.0 || ^8.0
- illuminate/contracts: ^5.6 || ^6 || ^7 || ^8
- illuminate/support: ^5.6 || ^6 || ^7 || ^8
Requires (Dev)
- phpunit/phpunit: ^9.3.8
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
实例,但会覆盖任何具有相同 name
、http-equiv
、itemprop
或 property
属性的现有标签。
合并数组属性
如果要合并的标签具有作为其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
实例,其中首先放置charset
和http-equiv="X-UA-Compatible"
标签。
如果提供回调函数,它将像PHP的uasort
参数一样使用。
可选操作
pipe(callable $callback)
方法将MetaTagBag
传递给给定的回调函数,并返回结果。例如,它可以用来自动检查MetaTagBag
是否包含某些标签,如果是,则添加或删除其他标签。
转换为 json
MetaTagBag
是JsonSerializable
,因此可以直接将其提供给PHP的json_encode()
函数。此外,由于MetaTagBag
实现了Laravel的Jsonable
合同,因此还存在toJson()
方法。
其他包
对于Laravel应用程序中元标签的更完整的解决方案,您应查看butschster/LaravelMetaTags。