secit-pl/json-ld-bundle

Schema.org JSON-LD生成器 Symfony 扩展包。

2.2.1 2017-11-10 12:14 UTC

This package is not auto-updated.

Last update: 2024-09-12 08:08:25 UTC


README

为Symfony 2.8和3.0+提供Schema.org JSON-LD生成器。

PHP 7支持

从版本3.3.2开始,在https://github.com/secit-pl/schema-org中,所有类型和属性都应该添加后缀。此扩展包允许使用两种类版本(新的带后缀的类和已弃用的不带后缀的类),但请注意,只有带后缀的类才能在PHP 7上正确工作。

迁移到新的类命名方案的另一原因是,在secit-pl/schema-org的3.4版本发布中,将删除所有不带后缀的类。

安装

从命令行运行

$ composer require secit-pl/json-ld-bundle

更新您的AppKernel,添加扩展包声明

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            ...
            new SecIT\JsonLdBundle\JsonLdBundle(),
        ];

        ...
    }
}

使用方法

基本用法

首先,您需要创建一个转换器,它将您的对象转换为schema.org数据映射。

namespace Test\TestBundle\JsonLd;

use SecIT\JsonLdBundle\Transformer\TransformerInterface;
use SecIT\SchemaOrg\Mapping\DataType\TextType;
use SecIT\SchemaOrg\Mapping\Property\NameProperty;
use SecIT\SchemaOrg\Mapping\Type\ThingType;

class TestTransformer implements TransformerInterface
{
    public function transform($object)
    {
        return (new ThingType())
            ->setName(new NameProperty(
                new TextType($object->getName())
            ));
    }
}

由于此扩展包的基础是https://github.com/secit-pl/schema-org,因此转换器应返回JSON-LD生成器接受的对象。

接下来,您需要使用services.yml中的secit.jsonld_transformer标签将转换器注册为服务。

services:
    test.object_transformer:
        class: Test\TestBundle\JsonLd\TestTransformer
        tags:
            - { name: secit.jsonld_transformer, class: Test\TestBundle\Classes\ClassToBeTransformedToJsonLd }

如果您想将多个类分配给同一个转换器,可以为同一个服务添加多个标签。

services:
    test.object_transformer:
        class: Test\TestBundle\JsonLd\TestTransformer
        tags:
            - { name: secit.jsonld_transformer, class: Test\TestBundle\Classes\Class1 }
            - { name: secit.jsonld_transformer, class: Test\TestBundle\Classes\Class2 }
            - { name: secit.jsonld_transformer, class: Test\TestBundle\Classes\Class3 }
            ...

从现在起,您可以按照以下方式转换在标签中指定的类属性对象(以下示例中的\Test\TestBundle\Classes\ClassToBeTransformedToJsonLd)到JSON-LD

$object = new \Test\TestBundle\Classes\ClassToBeTransformedToJsonLd();
$object->setName('Some name');
echo $this->getContainer()->get('secit.json_ld')->generate($object);

输出应该类似于以下内容

<script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"Thing","name":"Some name"}</script>

高级用法

在许多情况下,需要具有嵌套转换器,以便不在单个类中实现整个逻辑。要使用嵌套转换器,您的转换器应实现JsonLdAwareInterface。如果您不想自己实现接口方法,可以使用JsonLdAwareTrait。

以下是一个简单的示例,说明如何使用它

PersonTransformer.php

namespace Test\TestBundle\JsonLd;

use SecIT\JsonLdBundle\DependencyInjection\JsonLdAwareInterface;
use SecIT\JsonLdBundle\DependencyInjection\JsonLdAwareTrait;
use SecIT\JsonLdBundle\Transformer\TransformerInterface;
use SecIT\SchemaOrg\Mapping\DataType\TextType;
use SecIT\SchemaOrg\Mapping\Property\NameProperty;
use SecIT\SchemaOrg\Mapping\Type\PersonType;

class PersonTransformer implements TransformerInterface
{
    public function transform($person)
    {
        return (new PersonType())
            ->setName(new NameProperty(
                new TextType($person->name)
            ));
    }
}

ArticleTransformer.php

namespace Test\TestBundle\JsonLd;

use SecIT\JsonLdBundle\DependencyInjection\JsonLdAwareInterface;
use SecIT\JsonLdBundle\DependencyInjection\JsonLdAwareTrait;
use SecIT\JsonLdBundle\Transformer\TransformerInterface;
use SecIT\SchemaOrg\Mapping\DataType\TextType;
use SecIT\SchemaOrg\Mapping\Property\AuthorProperty;
use SecIT\SchemaOrg\Mapping\Property\NameProperty;
use SecIT\SchemaOrg\Mapping\Type\ArticleType;

class ArticleTransformer implements TransformerInterface, JsonLdAwareInterface
{
    use JsonLdAwareTrait;

    public function transform($article)
    {
        return (new ArticleType())
            ->setName(new NameProperty(
                new TextType($article->name)
            ))
            ->setAuthor(new AuthorProperty(
                $this->getJsonLd()->transform($article->author)
            ));
    }
}

示例输入对象

$author = new Person();
$author->name = 'Jon Smith';

$article = new Article();
$article->name = 'Example article';
$article->author = $author;

输出

<script type="application/ld+json">{"@context":"http:\/\/schema.org","@type":"Article","name":"Example article","author":{"@type":"Person","name":"Jon Smith"}}</script>

Twig支持

此扩展包还提供了一个Twig扩展,允许直接从Twig模板中渲染JSON-LD。

TestController

namespace Test\TestBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class TestController extends Controller
{
    public function testAction()
    {
        return $this->render('TestBundle:Test:example.html.twig', [
            'object' => new Foo(),
        ]);
    }
}

example.html.twig

{{ object|json_ld }}

输出

<script type="application/ld+json">{"@context":"http:\/\/schema.org", ... }</script>