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)。请参阅许可证文件以获取更多信息。