secit-pl / json-ld-bundle
Schema.org JSON-LD生成器 Symfony 扩展包。
Requires
- php: >=5.4.0
- secit-pl/schema-org: ^3.3.2
- symfony/dependency-injection: ~2.8|~3.0
- symfony/framework-bundle: ~2.8|~3.0
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>