coreplex/meta

一个易于扩展的PHP 5.4页面元容器

v0.2.7 2021-03-12 17:37 UTC

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.phpdrivers.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;
}

这将向您的模型添加两个方法;hasMetagetMeta。使用这些方法,您可以检查模型是否具有元数据,然后检索它。您还可以通过使用 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 集成,请遵循上述步骤