f9webltd / laravel-meta
在您的 Laravel 应用程序中渲染元标签
Requires
- php: ^8.0
- illuminate/config: ^8.12|^9.0|^10.0|^11.0
- illuminate/support: ^8.12|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^6.23|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.4|^10.1
This package is auto-updated.
Last update: 2024-09-18 11:22:29 UTC
README
Laravel 元标签
使用流畅的 API 轻松在您的 Laravel 应用程序中渲染元标签
特性
- 简单 API
- 渲染命名、属性、原始、Twitter 卡和 OpenGraph 类型的元标签
- 可选地,在每个请求上渲染默认标签
- 条件设置标签
- 可宏化
- 无需为每个控制器方法设置元标题。该包可以(可选地)根据 URI 段或当前命名的路由猜测标题
- 有良好的文档
- 经过测试,代码覆盖率 100%
要求
- PHP
^8.0
- Laravel
^8.12
,^9.0
,^10.0
或^11.0
遗留支持/升级
对于 PHP <8.0
和 Laravel <8.12
的支持,请使用包版本 ^1.7.7
如果从 ^1.0
升级,请参阅 UPGRADING 获取详细信息。
安装
composer require f9webltd/laravel-meta
该包将自动注册自己。
可选地,通过运行以下命令发布配置文件:
php artisan vendor:publish --provider="F9Web\Meta\MetaServiceProvider" --tag="config"
文档
此包旨在使向您的 Laravel 应用程序添加常见元标签变得轻而易举。
用法
在控制器中
meta() ->set('title', 'Buy widgets today') ->set('canonical', '/users/name') ->set('description', 'My meta description') ->set('theme-color', '#fafafa') ->noIndex();
要在 Blade 布局文件中输出元数据,请添加以下内容
{!! meta()->toHtml() !!}
<title>Buy widgets today - Meta Title Append</title> <link rel="canonical" href="https://site.co.uk/users/name" /> <meta name="description" content="My meta description"> <meta name="theme-color" content="#fafafa"> <meta name="robots" content="noindex nofollow">
可选地,可以使用 Meta
门面作为 meta()
助手的替代方案,生成相同的结果
Meta::set('title', 'Buy widgets today') ->set('canonical', '/users/name') ->set('description', 'My meta description') ->set('theme-color', '#fafafa') ->noIndex();
条件设置标签
可以使用 when()
方法来条件性地设置标签。一个布尔条件(指示是否执行闭包)和一个闭包。闭包参数是元类的完整实例,意味着所有方法都是可调用的。
$noIndex = true; meta()->when($noIndex, function ($meta) { $meta->noIndex(); });
when()
是流畅的,可以多次调用
meta() ->set('title', 'the title') -when(true, fn ($meta) => $meta->set('og:description', 'og description')) -when(false, fn ($meta) => $meta->set('referrer', 'no-referrer-when-downgrade')) ->noIndex();
Blade 指令
Blade 指令可用,作为在模板中使用 PHP 函数的替代方案。
渲染所有元数据
@meta
通过名称渲染特定的元标签
@meta('title')
其他标签类型
该包支持多种标签类型。
属性类型标签
要创建属性类型标签,在标签名称之前附加 property:
meta()->set('property:fb:app_id', '1234567890');
<meta property="fb:app_id" content="1234567890">
Twitter 卡标签
要创建 Twitter 卡标签,在标签名称之前附加 twitter:
meta()->set('twitter:site', '@twitter_user');
<meta name="twitter:site" content="@twitter_user">
Open Graph 标签
要创建 Open Graph(或 Facebook)标签,在标签名称之前附加 og:
meta() ->set('og:title', 'My new site') ->set('og:url', 'http://site.co.uk/posts/hello.html');
<meta property="og:title" content="My new site"> <meta property="og:url" content="http://site.co.uk/posts/hello.html">
其他标签类型
要创建其他标签类型,使用 raw()
方法
meta() ->setRawTag('<link rel="fluid-icon" href="https://gist.github.com/fluidicon.png" title="GitHub">') ->setRawTag('<link rel="search" type="application/opensearchdescription+xml" href="/opensearch-gist.xml" title="Gist">');
<link rel="fluid-icon" href="https://gist.github.com/fluidicon.png" title="GitHub"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch-gist.xml" title="Gist">
默认标签
可能希望在应用程序范围内渲染静态元标签。可选地在 f9web-laravel-meta.defaults
中定义常见标签。
例如,定义以下默认标签
'defaults' => [ 'robots' => 'all', 'referrer' => 'no-referrer-when-downgrade', '<meta name="format-detection" content="telephone=no">', ],
将在每个页面上渲染以下内容
<meta name="robots" content="all"> <meta name="referrer" content="no-referrer-when-downgrade"> <meta name="format-detection" content="telephone=no">
辅助方法
get()
通过名称获取特定标签值。
meta()->set('title', 'meta title'); meta()->get('title'); // meta title
对于不存在的标签,返回 null
。
render()
渲染所有定义的标签。在渲染 Blade 文件中的标签时调用 render()
。
以下调用是相同的。
{!! meta()->toHtml() !!} {!! meta()->render() !!}
将标签标题传递给 render()
将渲染该标签。
meta()->set('title', 'meta title'); meta()->render('title'); // <title>meta title</title>
fromArray()
从标签数组生成多个标签。
meta() ->fromArray([ 'viewport' => 'width=device-width, initial-scale=1.0', 'author' => 'John Joe', 'og:title' => 'When Great Minds Dont Think Alike', 'twitter:title' => 'Using Laravel 7', ]);
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="John Joe"> <meta property="og:title" content="When Great Minds Dont Think Alike"> <meta name="twitter:title" content="Using Laravel 7"> <title>Users - Edit - Meta Title Append</title>
setRawTags()
从数组生成多个原始标签。
meta() ->setRawTags([ '<link rel="alternate" type="application/rss+xml" title="New Releases - Packagist" href="https://packagist.org.cn/feeds/releases.rss" />', '<link rel="search" type="application/opensearchdescription+xml" href="/search.osd?v=1588083369" title="Packagist" />', '<meta charset="UTF-8" />' ]);
<link rel="alternate" type="application/rss+xml" title="New Releases - Packagist" href="https://packagist.org.cn/feeds/releases.rss" /> <link rel="search" type="application/opensearchdescription+xml" href="/search.osd?v=1588083369" title="Packagist" /> <meta charset="UTF-8" />
tags()
获取所有标签作为数组。
meta() ->set('title', 'meta title') ->set('og:title', 'og title'); $tags = meta()->tags(); /* [ "title" => "meta title" "og:title" => "og title" ]; */
purge()
删除之前设置的标签。
forget()
通过标题删除之前设置的标签。
meta() ->set('title', 'meta title') ->set('og:title', 'og title'); meta()->forget('title'); $tags = meta()->tags(); // ["og:title" => "og title"];
noIndex()
生成必要的标签以排除URL从搜索引擎索引。
meta()->noIndex();
<meta name="robots" content="noindex nofollow">
favIcon()
生成基本的favicon所需的标签。favicon路径可以在配置值f9web-laravel-meta.favicon-path
中指定。
meta()->favIcon();
<meta name="shortcut icon" content="https://site.co.uk/favicon.ico"> <link rel="icon" type="image/x-icon" href="https://site.co.uk/favicon.ico">
动态调用
为了提高可读性,可以执行动态方法调用。下面的代码块将渲染相同的HTML
meta() ->title('meta title') ->description('meta description') ->canonical('/users/me');
meta() ->set('title', 'meta title') ->set('description', 'meta description') ->set('canonical', '/users/me');
宏支持
该包实现了Laravel的Macroable
特质,这意味着可以在运行时向主Meta服务类添加额外的方法。例如,[Laravel的集合类是可宏化的](更多信息请见以下示例)。
noIndex
和favIcon
辅助函数在包服务提供者中定义为宏。
设置任意默认SEO标签的示例宏
// within a service provider Meta::macro('seoDefaults', function () { return Meta::favIcon() ->set('title', $title = 'Widgets, Best Widgets') ->set('og:title', $title) ->set('description', $description = 'Buy the best widgets from Acme Co.') ->set('og:description', $description) ->fromarray([ 'twitter:card' => 'summary', 'twitter:site' => '@roballport', ]); });
调用新定义的宏
meta()->seoDefaults();
宏也可以接受参数。
Meta::macro('setPaginationTags', function (array $data) { $page = $data['page'] ?? 1; if ($page > 1) { Meta::setRawTag('<link rel="prev" href="' . $data['prev'] . '" />'); } if (!empty($data['next'])) { return Meta::setRawTag('<link rel="next" href="' . $data['next'] . '" />'); } return Meta::instance(); });
meta()->setPaginationTags([ 'page' => 7, 'next' => '/users/page/8', 'prev' => '/users/page/6', ]);
为了允许流畅的方法调用,确保宏返回类的实例。
特殊标签
元标题
该包确保始终存在元标签。省略标题将强制包根据当前命名的路由或uri猜测一个。
要设置首选方法,编辑配置值f9web-laravel-meta.title-guessor.method
。
uri
方法示例
- 如果uri是
/orders/create
,则猜测的标题为“Orders - Create” - 如果uri是
/orders/9999/edit
,则猜测的标题为“Orders - 9999 - Edit”
route
方法示例
- 当前命名的路由是
users.create
,猜测的标题为'Users - Create' - 当前命名的路由是
users.index
,猜测的标题为'Users'
可以通过编辑配置值f9web-laravel-meta.title-guessor.enabled
来禁用此行为。
此自动解析对于大型应用程序非常有用,否则为每个控制器方法设置元数据可能很麻烦。
将文本附加到元标题
通常,将公司名称等常见数据附加到元标题。
可以将配置值f9web-laravel-meta.meta-title-append
设置为自动将指定字符串附加到每个元标题。
要禁用此行为,将f9web-laravel-meta.meta-title-append
设置为null
。
限制元标题长度
出于SEO原因,元标题长度应受限制。默认情况下,此包将标题限制为60个字符。
要更改此行为,请更新配置值f9web-laravel-meta.title-limit
。设置为null
以停止限制。
元描述
出于SEO原因,元描述通常应少于~160个字符。默认情况下,此包不限制长度。
要更改限制,请调整配置值f9web-laravel-meta.description-limit
。设置为null
以停止限制。
规范链接
设置合理的规范链接非常重要。可选地,该包可以在生成规范时自动替换用户定义的字符串。
由于设置不正确,某些Laravel安装允许在URL中使用public
和/或index.php
。
例如,/users/create
、/public/users/create
和/public/index.php/users/create
都将是可以访问、可爬取并最终可索引的URL。
通过编辑f9web-laravel-meta.removable-uri-segments
中的可移除URL字符串数组,可以控制此行为。
默认情况下,该包会自动从规范URL中删除public
和index.php
。
贡献
欢迎任何想法。请随时提交任何问题或拉取请求。
测试
composer test
安全性
如果您发现任何与安全相关的问题,请通过电子邮件rob@f9web.co.uk联系,而不是使用问题跟踪器。
鸣谢
许可协议
MIT许可(MIT)。有关更多信息,请参阅许可文件。