f9webltd/laravel-meta

在您的 Laravel 应用程序中渲染元标签

2.0.1 2024-03-18 10:22 UTC

README

Packagist Version Run Tests - Current StyleCI Status License

Laravel 元标签

使用流畅的 API 轻松在您的 Laravel 应用程序中渲染元标签

特性

要求

  • 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的集合类是可宏化的](更多信息请见以下示例)。

noIndexfavIcon辅助函数在包服务提供者中定义为宏。

设置任意默认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中删除publicindex.php

贡献

欢迎任何想法。请随时提交任何问题或拉取请求。

测试

composer test

安全性

如果您发现任何与安全相关的问题,请通过电子邮件rob@f9web.co.uk联系,而不是使用问题跟踪器。

鸣谢

许可协议

MIT许可(MIT)。有关更多信息,请参阅许可文件