spatie/schema-org为所有Schema.org 类型及其属性提供了一个流畅的构建器。 src中的代码是从 Schema.org 的 JSON-LD 标准文件生成的,因此它为整个核心词汇表提供了对象和方法。这些类和方法也被完整记录下来作为快速参考。
使用 SpatieSchemaOrgSchema;$localBusiness = Schema::localBusiness()
->名称('斯帕蒂')
->电子邮件('[email protected]')
->contactPoint(Schema::contactPoint()->areaServed('全球'));echo $localBusiness->toScript(); <script type="application/ld+json">{"@context": "https://schema.org","@type": "LocalBusiness","name": "Spatie","email": " [email protected]","contactPoint": {"@type": "ContactPoint","areaServed": "全球"}}</script>我们投入了大量资源来创建一流的开源包。您可以通过购买我们的一款付费产品来支持我们。
我们非常感谢您从家乡寄给我们一张明信片,并注明您正在使用我们的哪种套餐。您可以在我们的联系页面上找到我们的地址。我们在虚拟明信片墙上发布所有收到的明信片。
您可以通过 Composer 安装该软件包:
作曲家需要 spatie/schema-org
所有类型都可以通过SpatieSchemaOrgSchema工厂类或使用new关键字进行实例化。
$localBusiness = Schema::localBusiness()->name('Spatie');// 等价于:$localBusiness = new LocalBusiness();$localBusiness->name('Spatie');所有类型还接受预期数据类型的数组,例如
sameAs接受字符串或字符串数组。
所有类型还实现 SPL 的ArrayAccess以便通过数组表示法访问属性:
$anotherLocalBusiness = new LocalBusiness();var_dump(isset($anotherLocalBusiness['name'])); // => false$anotherLocalBusiness['name'] = 'Spatie';var_dump(isset($anotherLocalBusiness['name'])); // => truevar_dump($anotherLocalBusiness['name']); // => 'Spatie'unset($anotherLocalBusiness['name']);var_dump(isset($anotherLocalBusiness['name'])); // => 假
类型可以转换为数组或呈现为脚本。
$localBusiness->toArray();echo $localBusiness->toScript();echo $localBusiness; // 与 `toScript()` 相同的输出
此外,只需使用对象调用json_encode()即可将所有类型转换为纯 JSON 字符串:
回声 json_encode($localBusiness);
我建议使用 Google 的结构化数据测试工具仔细检查您的结构化数据。
从 v1.6.0 开始,所有枚举子类型都可以作为带有常量的类。
Schema::book()->bookFormat(SpatieSchemaOrgBookFormatType::Hardcover);
没有关于类型和属性的完整 API 文档。您可以参考来源或 schema.org 网站。
如果您不想破坏大型架构对象的链,可以使用if方法有条件地修改架构。
使用 SpatieSchemaOrgLocalBusiness;使用 SpatieSchemaOrgSchema;$business = ['name' => 'Spatie'];$localBusiness = Schema::localBusiness()
->名称($business['名称'])
->if(isset($business['email']), function (LocalBusiness $schema) use ($business) {$schema->email($business['email']);
});从 v2.6.0 开始,对于简单的字符串标识符, identifier键被@id替换。这是由于ld+json语法的定义造成的。
所有 schema.org 语法都已经具有 URI 和 URL 的内置表示,例如在 Microdata 中的“itemid”、在 RDFa 1.1 中的“resource”、在 JSON-LD 中的“@id”。
— schema.org/docs // PR#102 // PR#157
如果您需要设置自定义属性,可以使用setProperty方法。
$localBusiness->setProperty('foo', 'bar');如果您需要检索属性,可以使用getProperty方法。您可以选择传入第二个参数来提供默认值。
$localBusiness->getProperty('名称'); // 'Spatie'$localBusiness->getProperty('bar'); // null$localBusiness->getProperty('bar', 'baz'); // '巴兹'所有属性都可以使用getProperties方法作为数组进行检索。
$localBusiness->getProperties(); // ['name' => 'Spatie', ...]
可以使用addProperties方法一次设置多个属性。
$localBusiness->addProperties(['name' => 'value', 'foo' => 'bar']);
可以使用getContext和getType方法检索上下文和类型。
$localBusiness->getContext(); // 'https://schema.org'$localBusiness->getType(); // '本地企业'
Graph 有很多方法和实用程序 - 类型安全且最简单的方法是使用SpatieSchemaOrgSchema类本身的重载方法。这些方法将获取所请求模式的已创建实例或新实例。
$graph = new Graph();// 创建产品并预链接组织$graph->product()
->name('我的酷产品')
->brand($graph->organization());// 从创建的脚本标签中隐藏组织$graph->hide(SpatieSchemaOrgOrganization::class);// 在其他地方填写组织$graph->organization()
->name('My Awesome Company');// 将图形渲染到脚本 tagecho $graph;使用这些工具,图表是所有可用模式的集合,可以将这些模式相互链接并防止在脚本标签中呈现辅助模式。
有时,您必须跟踪同一类型的多个图形节点 - 例如组织中不同人员的多个Person节点。为此,您可以在图形实例上使用节点标识符。如果您不提供标识符,将使用保留关键字default标识符。
use SpatieSchemaOrgGraph;use SpatieSchemaOrgPerson;$graph = new Graph();// 使用链接添加一个 Person $graph->person('freekmurze')
->给定名称('弗里克')
->familyName('范德赫滕')
->alternateName('freekmurze');// 使用closure$graph->person('sebastiandedeyne', function(Person $sebastian, Graph $graph): void {$sebastian->givenName('Sebastian') 添加一个Person
->familyName('De Deyne')
->alternateName('sebastiandedeyne');
});
// 使用闭包添加一个人,并使用相同的标识符进行第二次调用$graph->person('gummibeer', fn(Person $gummibeer) => $gummibeer->alternateName('gummibeer')
);$graph->person('口香糖啤酒')
->givenName('汤姆')
->familyName('Witkowski');$graph->person('random')->name('Random Person');// 从 Graph 中隐藏随机人物$graph->hide(Person::class, 'random ');回显 json_encode($graph); {“@context”:“https://schema.org”,“@graph”:[
{"@type":"Person","givenName":"弗里克","familyName":"范德赫滕","alternateName":"freekmurze"},
{"@type":"Person","givenName":"塞巴斯蒂安","familyName":"De Deyne","alternateName":"sebastiandedeyne"},
{"@type":"Person","alternateName":"gummibeer","givenName":"Tom","familyName":"Witkowski"}
]
}Schema.org 允许多类型实体 - 要将它们与此包一起使用,您可以使用MultiTypedEntity类 - 其工作方式与图类似。
$mte = new MultiTypedEntity();$mte->hotelRoom()->name('总统套房');$mte->product()->offers(
架构::报价()
->name('一晚')
->价格(100000.00)
->价格货币('美元')
);$mte->产品(函数(产品$产品){$产品->aggregateRating(
模式::aggregateRating()
->最佳评分(5)
->最差评级(4)
);
});回显 json_encode($mte); { "@context":"https://schema.org", "@type":[ "酒店房间", "产品"
], "name":"总统套房", "offers":{ "@type":"优惠", "name":"一晚", "price":100000, "priceCurrency":"USD"
}, "aggregateRating":{ "@type":"AggregateRating", "bestRating":5, "worstRating":4
}
}对于如何合并属性,并没有真正的规则。它仅在幕后使用array_merge() 。因此,您应该避免在 MTE 中的不同类型上定义相同的属性,或者确保所有属性都具有相同的值,最终使用哪个属性并不重要。
Float类型不可用,因为它是 PHP 中的保留关键字
Physician类型不可用,因为它扩展了health扩展规范的类型
请参阅变更日志以了解最近更改的更多信息。
$ 作曲家测试
详细信息请参阅贡献。
如果您发现有关安全的错误,请发送邮件至 [email protected],而不是使用问题跟踪器。
您可以自由使用这个软件包,但如果它进入您的生产环境,我们非常感谢您从您的家乡给我们寄一张明信片,注明您正在使用我们的哪个软件包。
我们的地址是:Spatie, Kruikstraat 22, 2018 安特卫普, 比利时。
我们在公司网站上发布所有收到的明信片。
塞巴斯蒂安·德·戴因
汤姆·维特科斯基
所有贡献者
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。