critiq / laravel-head-manifest
在Laravel和SPA项目间共享一个清单,定义HTML头部属性,以便爬虫可以访问到路径特定的元数据,而无需在SPA端进行服务器端渲染
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环境中使用,同时不牺牲页面特定元数据的优点。