coreplex / meta
一个易于扩展的PHP 5.4页面元容器
Requires
- php: >=5.4.0
This package is auto-updated.
Last update: 2024-09-13 01:33:38 UTC
README
一个易于扩展的PHP 5.4页面元容器
安装与要求
此包需要PHP 5.4或更高版本。要安装,只需将此行添加到您的composer.json
文件下的require键即可
"require": { "coreplex/meta": "0.*" }
Laravel集成
要使用此包与Laravel一起使用,安装后只需执行以下步骤
将服务提供者添加到您的config/app.php
文件中的providers数组中
'Coreplex\Meta\MetaServiceProvider',
然后您需要使用命令行发布所需的资源。运行此命令来提供此操作
php artisan vendor:publish --provider="Coreplex\Meta\MetaServiceProvider"
接下来,您需要迁移数据库表,该表将作为任何元项的存储库
php artisan migrate
完成此操作后,您可以开始使用此包,并在数据库中填充一些示例元信息
首先,让我们添加一个默认的元组以查看其效果。运行以下代码来创建一个默认的元
$meta = Coreplex\Meta\Eloquent\Meta::create([ 'identifier' => 'default', 'default' => true ]); $meta->items()->insert(['key' => 'title', 'data' => 'Welcome to this website']); $meta->items()->insert(['key' => 'description', 'data' => 'This is a fantastic website with lots of features and even a walrus gallery']);
这将把默认的元记录插入到数据库中,这将用于每个单独的页面,任何额外的记录将合并到顶部(除非被覆盖,这很容易做到!)。您不必这样做,但这是一种添加默认元数据集的好方法。
要在视图中渲染元数据,您只需输出绑定到应用的元容器即可,它将被转换为干净的HTML。
<html> <head> <?php // You will probably want to use a view composer for this line, as it is // actually bad practice! $meta = $app['coreplex.meta']; // Render the meta items from the container echo $meta; ?> </head> <body> </body> </html>
使用默认配置,这将输出
<title>Welcome to this website | MyWebsite.com</title> <meta name="description" content="This is a fantastic website with lots of features and even a walrus gallery">
别忘了,如果您使用laravel blade,您必须使用非转义的blade echo标签(
!!{ !!}
),否则元数据将无法正确输出。
如果您想完全覆盖元数据,从您的应用中检索元容器并使用set()
方法来覆盖它。您可以传入一个Coreplex\Meta\Contracts\Group
的实例(Coreplex\Meta\Eloquent\Meta
模型实现了此接口),或者传入一个字符串标识符,该标识符将用于从存储库中查找。
$meta = Coreplex\Meta\Eloquent\Meta::create([ 'identifier' => 'login_page' ]); $meta->items()->insert(['key' => 'title', 'data' => 'Please login to your account...']);
use Coreplex\Meta\Contracts\Container as MetaContainer; class LoginController extends Controller { public function login(MetaContainer $container) { $container->set('login_page'); } }
当元数据被输出时,这将输出到页面
<title>Please login to your account... | MyWebsite.com</title>
如果您只想合并而不覆盖默认样式,请在容器上使用add()
方法。
public function login(MetaContainer $container) { $container->add('login_page'); }
这将输出我们插入的两个元组的合并变体
<title>Please login to your account... | MyWebsite.com</title> <meta name="description" content="This is a fantastic website with lots of features and even a walrus gallery">
您可以合并任意多个元组,但要记住,最后合并的组将覆盖其之前合并的任何元项
配置元模板
元库知道如何以不同的方式渲染每种类型的元元素。它是通过配置文件来做到这一点的。
在您的配置文件夹中,您将找到meta.php
和drivers.php
。在meta.php中,您将看到类似以下的内容
'elements' => [ 'title' => [ 'element' => 'title', 'empty' => false, 'content' => ':content | MyWebsite.com', ], 'charset' => [ 'keyAttribute' => false, 'valueAttribute' => 'charset' ] ],
此数组定义了每个元素如何在页面上显示。以下是您可以在每个元素上使用的每个配置键
- element:指定要渲染的元素,例如,值为
title
将渲染一个<title>
元素。这是必需的 - empty:指定元素是否有开标签或闭标签。如果设置为
false
,则元素将始终添加指定元素的结束标签 - keyAttribute:指定是否将某个属性应用于包含元数据键值的元素。例如,如果您有一个
description
元素,您通常会将keyAttribute
属性设置为name
,这样就会在页面上输出<meta name="description" content="..."></meta>
。如果设置为 false,则不会添加带有元数据键的属性 - valueAttribute:与
keyAttribute
属性具有相同的行为,但它将元数据项实例的 "data" 值放入此属性中。 - content:允许您为元数据项创建一个模板。特别适用于您想在标题后添加类似 " | MyWebsite.com" 这样的内容。只需在字符串中使用
:content
,当渲染时这将替换为元数据项的数据值。如果您的元数据项具有 JSON 编码的数据,并且empty
设置为 false,则可以使用:
标识符后跟 JSON 对象中的任何键来替换它。 - extends:类似于类扩展,您指定另一个元数据元素模板的键,并将其属性合并到要扩展的模板中。特别适用于您不希望重复使用如 'og:title' 这样的元素。您可以通过查看提供的默认配置来查看示例。
如果元数据表中没有指定键的模板,它将使用 meta.default
的值作为模板,默认情况下渲染一个 <meta name="{key}" content="{data}">
元素,除非您选择更改此行为。
单个元数据项中的更多数据
如果元数据为空(没有闭合标签),并且元数据记录的 "data" 列中的字符串是 JSON 编码的,它将循环遍历每个键并将它们作为属性放入。
$meta = Coreplex\Meta\Eloquent\Meta::create([ 'identifier' => 'new_page' ]); $meta->items()->insert(['key' => 'keywords', 'data' => '{content: "hello world", rel: "keywords-tag"}']);
渲染时将产生这样的结果
<meta name="keywords" content="hello world" rel="keywords-tag">
如果您不想有多个属性,可以仅将标准字符串传递到数据列。
使用 HasMetaData
特性
我们创建了一个方便的特性,可以放置在您的模型上以立即允许它具有元数据。这是通过使用多态关系在幕后完成的。为了使其正常工作,只需将其添加到模型类的第一行即可
use Coreplex\Meta\Eloquent\HasMetaData; class Page extends Model { use HasMetaData; }
这将向您的模型添加两个方法;hasMeta
和 getMeta
。使用这些方法,您可以检查模型是否具有元数据,然后检索它。您还可以通过使用 meta
关系来访问元数据,您可以使用它来创建和更新元数据。
当您检索元数据时,它将返回一个 Coreplex\Meta\Eloquent\Meta 实例,该实例具有所有绑定到它的项目,正如我们在上面的示例中所看到的。然后您可以在我们的控制器中通过做一些类似以下的事情来设置它
public function home(MetaContainer $container) { $page = Page::find(1); if ( ! $page) { abort(404); } if ($page->hasMeta()) { $container->add($page->getMeta()); } }
这非常适合您想将元数据绑定到系统中的任何数据库表。页面元数据组可以绑定到各种事物,从数据库中的 pages
表记录到 products
表记录。
您可以在控制器中这样做以编写任何没有元数据项的项目的回退
public function home(MetaContainer $container, $productId) { $product = Product::find($productId); if ( ! $product) { abort(404); } if ($product->hasMeta()) { $container->add($page->getMeta()); } else { // Empties any defaults out of the container $container->flush(); // Add auto-generated meta data $container->add('title', $product->title); $container->add('description', $product->short_description); } }
使用 MetaVariant
特性
我们还添加了具有元数据变体的功能,这对于您有多个国家、网站等并且需要为每个变体具有不同元数据非常有用。
要开始,您需要实现 Variant
接口,然后如果您正在使用模型,则使用 MetaVariant
特性。
use Coreplex\Meta\Contracts\Variant; use Coreplex\Meta\Eloquent\MetaVariant; class Country implements Variant { use MetaVariant; }
然后您可以在设置或添加元数据时提供元数据变体,它将加载变体的元数据。
$variant = Country::find(1); $container->add($page->getMeta($variant));
如果您正在使用键而不是模型来设置您的元数据,则可以将变体作为第二个参数传递。
$variant = Country::find(1); $container->set('global', $variant);
非 Laravel 使用
目前没有提供非 Laravel 使用指南。但是,如果您正在与 Laravel 5 集成,请遵循上述步骤