critiq / laravel-head-manifest

在Laravel和SPA项目间共享一个清单,定义HTML头部属性,以便爬虫可以访问到路径特定的元数据,而无需在SPA端进行服务器端渲染

dev-master 2023-12-11 21:15 UTC

This package is not auto-updated.

Last update: 2024-09-26 18:56:07 UTC


README

安装

步骤 1:将Laravel Head Manifest添加到您的laravel项目中

composer require critiq/laravel-head-manifest

步骤 2:LaravelHeadManifestServiceProvider添加到您的应用程序配置的服务提供者中

app/config/app.php

 'providers' => [

        ... // Other providers,

        App\Providers\RouteServiceProvider::class,
        + Critiq\LaravelHeadManifest\LaravelHeadManifestServiceProvider::class,

步骤 3:创建您的清单文件

在您的public文件夹中,创建head-manifest.json,具有以下基本结构

{
    "defaultTitle": "Welcome to Laravel Head Manifest",
    "globalMeta": [],
    "defaultMeta": [],
    "paths": {
        "test/1": {
            "title": "Test1 Title",
            "meta": [
                {
                    "name": "Description",
                    "property": "description",
                    "content": "This is a description"
                }
            ]
        },
        "test/2": {
            "title": "Test2 Title",
            "meta": []
        },
    }
    
}

步骤 4:在您的blade文件中,添加$metadata变量

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        +{!! $metadata !!}

        ... // Rest of blade template

用法

定义您的路径结构

基本路径结构

在清单的paths值中,您可以定义代表路径及其关联对象的键,该对象包含关联路径的标题和元对象(关于元对象的更多信息稍后提供)。

{
    ... // Rest of manifest
    "paths": {
        "/": {
            "title": "Home",
            "meta": [],
        }
    }
}

如果您在路径对象中未指定title,它将回退到清单的defaultTitle值。

元数据结构

元数据结构是一个字典,它直接转换为HTML meta标签的属性

例如

... // Rest of manifest
"meta": [
    { "name": "description", "content": "This is a sample meta description"}
],

将转换为

<meta name="description" content="This is a sample meta description" />

全局元数据

指定根globalMeta元数据对象的列表始终会被添加。如果您需要在每个页面上都有元数据,这将非常有用。

默认元数据

指定根defaultMeta元数据对象的列表只有在请求路径不匹配或路径的meta字段未指定时才会被添加。如果您想从路径中省略默认元数据,请将meta值传递为一个空数组。

路径变量

Laravel Head Manifest支持可变路径。在定义路径键时,使用冒号:前缀路径部分,后跟变量的名称。

示例

{
    ... // Rest of manifest
    "paths": {
        "/page/:pageName": {
            "title": "You're visiting: :pageName",
        }
    }
}

如果您导航到/page/cats,这将匹配/page/:pageName路径,并将pageName变量设置为"cats"。您可以在路径对象中的任何字符串中引用此变量。

匹配具有前缀的所有路径

如果您想支持从根路径匹配所有嵌套路径,可以在路径名称后附加一个*

示例

{
    ... // Rest of manifest
    "paths": {
        "/admin/*": {
            "title": "Secret admin dashboard",
        }
    }
}

访问路径,如/admin/admin/banusers/admin/purge/everything都将匹配定义的/admin/*路径。

从服务器获取解析的路径数据

Laravel Head Manifest包含一个简单的控制器,可以用来解析路径并返回指定路径的头部数据(无需导航到该路径)。这是以LaravelHeadManifestController的形式。由于Laravel的默认RouteServiceProvider结构,我们建议以下做法

步骤 1:app/Http/Controllers中创建一个HeadManifestController.php文件,并定义控制器

<?php

namespace App\Http\Controllers;

use Critiq\LaravelHeadManifest\LaravelHeadManifestController;

class HeadManifestController extends LaravelHeadManifestController { }

步骤 2:在您的web.php中创建一个到新控制器的GET路由

Route::get('head-manifest', 'HeadManifestController@index');

注意:根据您的项目结构,这可能不会立即生效。我建议您阅读有关Laravel路由系统的工作原理(特别是RouteServiceProvider中的命名空间)的相关内容。创建自己的HeadManifestController不是必需的,您可以直接路由到LaravelHeadManifestController类。

为什么这个项目?

单页面应用程序(SPA)并不总是与我们的机器人朋友(如Google爬虫、Facebook/Slack/Discord等展开功能,以及许多其他)很好地配合工作。本项目的目标是提供一种优雅的方式来定义您的头部数据,以便在SPA环境中使用,同时不牺牲页面特定元数据的优点。