capdataopera/php-sdk
Composer 安装命令:
composer require capdataopera/php-sdk
包简介
Development kit to expose and fetch CapData Opera ontology in RDF format.
README 文档
README
Développements réalisés dans le cadre du projet CapData Opéra - France 2030, porté par la Réunion des Opéras de France. \ Opération soutenue par l'État dans le cadre du dispositif « Expérience augmentée du spectacle vivant » de France 2030, opéré par la Caisse des Dépôts. \ Information sur https://www.rof.fr/rof/capdata-opera.aspx.
Le SDK PHP permet :
- [x] d'exposer des données structurées modélisées selon l'ontologie CapData Opéra au format RDF.
- [ ] d'interroger ces données via le langage SPARQL et hydrater des objets PHP à partir des résultats de ces requêtes.
Sommaire
- Documentation
- Utilisation
- Plus en détails
- Choisir les ontologies pour la sérialisation
- Comment contribuer au projet
- Crédits
Documentation
Le SDK est développé avec un typage fort et des PHP-doc renseignant les types et des génériques. Nous vous conseillons de paramétrer votre IDE pour qu'il tire parti de ces informations. Cela vous permettra d'avoir une aide à la saisie et une documentation en temps réel.
Liens utiles
- Présentation du projet CapData Opéra : https://www.rof.fr/ROF/doc/SYRACUSE/89577/
- Référentiels : https://www.rof.fr/rof/capdata-opera-referentiels.aspx
- Ontologie : https://ontologie.capdataculture.fr/v1/
- Visualisation du modèle de données : https://ontologie.capdataculture.fr/v1/owl/webvowl/index.html#
- SPARQL EXPLORER : https://sparql.capdataculture.fr/
Utilisation
Installation dans un projet
composer require capdataopera/php-sdk
Exemple d'utilisation
Voici un exemple simpliste d'utilisation du SDK pour créer un graphe RDF et le sérialiser au format Turtle.
<?php
use CapDataOpera\PhpSdk\Graph\Graph;
use CapDataOpera\PhpSdk\Model\Collectivite;
use CapDataOpera\PhpSdk\Model\Isni;
use CapDataOpera\PhpSdk\Serializer\Serializer;
$serializer = new Serializer();
$graph = new Graph();
$ownOrg = new Collectivite('https://mon-opera.fr/organization/1');
$ownOrg->setNom('Mon opéra de test')
->setFacebook('https://facebook.com/mon-opera')
->setSiteWeb('https://mon-opera.fr')
->setCatalogageSourceAgence($ownOrg)
->setDateCreationRessource(new \DateTimeImmutable('2022-01-30T00:00:00+00:00'))
->setDateModificationRessource(new \DateTimeImmutable('2024-01-30T00:00:00+00:00'))
->setIsni(new Isni('https://isni.org/isni/0000000122982840'));
$graph->add($ownOrg);
/*
* On exporte le graph en RDF avec les ontologies capdata et schema.org pour obtenir un fichier Turtle
*/
echo $serializer->serialize($graph, 'turtle', ['capdata', 'schema']);
Classes supportées
- [x] Adresse postale: https://ontologie.capdataculture.fr/v1/owl/#Adresse
- [x] Categorie d'oeuvre: https://ontologie.capdataculture.fr/v1/owl/#CategorieOeuvre
- [x] Collectivité: https://ontologie.capdataculture.fr/v1/owl/#Collectivite
- [x] Fonction: https://ontologie.capdataculture.fr/v1/owl/#Fonction
- [x] Genre d'oeuvre: https://ontologie.capdataculture.fr/v1/owl/#GenreOeuvre
- [x] Historique de Production: https://ontologie.capdataculture.fr/v1/owl/#HistoriqueProduction
- [x] Lieu: https://ontologie.capdataculture.fr/v1/owl/#LieuGeographique
- [x] Media: https://ontologie.capdataculture.fr/v1/owl/#Media (Ne pas utiliser directement, utiliser les sous-classes)
- [x] Image: http://purl.org/dc/elements/1.1/Image
- [ ] MovingImage: http://purl.org/dc/elements/1.1/MovingImage
- [x] Sound: http://purl.org/dc/elements/1.1/Sound
- [x] Text: http://purl.org/dc/elements/1.1/Text
- [x] Image: http://purl.org/dc/elements/1.1/Image
- [x] Oeuvre: https://ontologie.capdataculture.fr/v1/owl/#Oeuvre
- [x] Participation: https://ontologie.capdataculture.fr/v1/owl/#Participation
- [x] Auteur: https://ontologie.capdataculture.fr/v1/owl/#Auteur
- [x] Collaboration technique et artistique: https://ontologie.capdataculture.fr/v1/owl/#Collaboration
- [x] Interprétation: https://ontologie.capdataculture.fr/v1/owl/#Interpretation
- [x] Maitrise d'oeuvre: https://ontologie.capdataculture.fr/v1/owl/#MaitriseOeuvre
- [x] Mention de production: https://ontologie.capdataculture.fr/v1/owl/#MentionProduction
- [x] Partenariat: https://ontologie.capdataculture.fr/v1/owl/#Partenariat
- [x] Programmation: https://ontologie.capdataculture.fr/v1/owl/#Programmation
- [x] Pays: https://ontologie.capdataculture.fr/v1/owl/#Pays
- [x] Personne: https://ontologie.capdataculture.fr/v1/owl/#Personne
- [x] Production Primaire: https://ontologie.capdataculture.fr/v1/owl/#ProductionPrimaire
- [x] Production: https://ontologie.capdataculture.fr/v1/owl/#Production
- [x] Rôle: https://ontologie.capdataculture.fr/v1/owl/#Role
- [x] Saison: https://ontologie.capdataculture.fr/v1/owl/#Saison
- [x] Statut juridique: https://ontologie.capdataculture.fr/v1/owl/#StatutJuridique
- [x] Type d'oeuvre: https://ontologie.capdataculture.fr/v1/owl/#TypeOeuvre
- [x] Type d'événement: https://ontologie.capdataculture.fr/v1/owl/#TypeEvenement
- [x] Type de production: https://ontologie.capdataculture.fr/v1/owl/#TypeProduction
- [x] Type de public: https://ontologie.capdataculture.fr/v1/owl/#TypePublic
- [x] Événement: https://ontologie.capdataculture.fr/v1/owl/#Evenement
Pour les médias, il est recommandé d'utiliser les sous-classes Image, Sound et Text.
Plus en détails
Immutabilité des données
Les données primitives de chaque classe sont représentées par un Value Object pour valider les données et les rendre immutables.
Cardinalité
En utilisant les Value Object pour représenter les données, on peut gérer la cardinalité des propriétés d'une classe, en construisant un Value Object qui représente une collection de valeurs plutôt qu'une valeur unique.
Tous les ValueObject peuvent accepter une primitive ou bien un tableau de primitives. Les méthodes __toString et
__serialize permettent de récupérer la valeur primitive ou le tableau de valeurs primitives de manière forcée.
Le Value Object est responsable de la validation des données en entrée.
<?php
$simpleString = new StringObject('foo');
$multipleString = new StringObject(['foo', 'bar']);
echo $simpleString; // 'foo'
echo $multipleString; // 'foo, bar' (concaténation des valeurs avec une virgule)
var_dump($simpleString->__serialize()); // ['foo']
var_dump($multipleString->__serialize()); // ['foo', 'bar']
Correspondance avec schema.org
Le SDK permet de construire automatiquement certaines correspondances entre les ontologies CapData Opéra et schema.org.
<https://mon-opera.fr/production/1>
a schema:Thing, rof:Production, schema:CreativeWork ;
rof:aPourInterpretation <https://mon-opera.fr/interpretation/1>, <https://mon-opera.fr/interpretation/2> ;
Valeurs multilingues
Les noms, descriptions, contenus éditoriaux et libellés de Referentiel peuvent porter des littéraux
balisés par langue via le LocalizedStringObject. Lorsqu'elles sont renseignées, les valeurs localisées
sont sérialisées avec leur balise de langue ("Opéra de Lyon"@fr) ; sinon, l'API non localisée se comporte
comme avant.
<?php
$lieu->setLocalizedName(['fr' => 'Opéra de Lyon', 'en' => 'Lyon Opera']);
$lieu->setLocalizedDescription([
'fr' => 'Le Grand Théâtre…',
'en' => 'The Grand Theatre…',
]);
// L'API non localisée reste disponible :
$lieu->setName('Opéra de Lyon');
Page web publique
Toute classe Thing (via HasUrl) accepte une URL de page web publique, ou une page par langue.
Elle est émise en schema:url (sortie schema uniquement) :
<?php
$production->setUrl('https://www.opera-lyon.com/fr/spectacle/…');
$production->setUrl([
'https://www.opera-lyon.com/fr/spectacle/…',
'https://www.opera-lyon.com/en/show/…',
]);
// Une page par langue → un nœud schema:WebPage par langue (schema:inLanguage)
$lieu->setLocalizedUrl([
'fr' => 'https://www.opera-lyon.com/fr/',
'en' => 'https://www.opera-lyon.com/en/',
]);
À ne pas confondre avec
HasSocials::setSiteWeb():siteWebest le site propre de la ressource (ex. le site personnel d'un·e artiste), tandis quesetUrl()désigne la page qui la présente (ex. la page de l'opéra dédiée à cet·te artiste). Les deux sont émises enschema:url.
Saison comme schema:EventSeries
Saison reste un skos:Concept / rof:Saison et est désormais aussi typée schema:EventSeries, avec des
dates de début et de fin. Chaque représentation (Evenement) référence la saison via schema:superEvent
(Evenement::setAPourSaison(...)).
<?php
$saison->setDateDebut('2025-09-01');
$saison->setDateFin('2026-07-15'); // → schema:startDate / schema:endDate
Pour le détail des évolutions de la v0.8 (DataTourisme, couverture schema.org étendue, multilingue…), voir UPGRADE_v0.8.md.
Hiérarchies : œuvres composées et regroupements d'événements
Deux relations (additives, opt-in) permettent de modéliser des hiérarchies sans créer de nouvelle
classe d'ontologie. Elles sont émises uniquement côté schema: (le namespace rof: reste
inchangé).
Œuvre composée — Production → Production. Une œuvre peut faire partie d'une œuvre plus large.
Production::setFaitPartieDe(...) émet schema:isPartOf vers le parent, et le parent reçoit
l'inverse schema:hasPart.
<?php
$parent = new Production('https://mon-opera.fr/production/300'); // « Icônes »
$dance = new Production('https://mon-opera.fr/production/301');
$hope = new Production('https://mon-opera.fr/production/302');
$dance->setFaitPartieDe($parent); // → schema:isPartOf <…/300> ; <…/300> schema:hasPart <…/301>
$hope->setFaitPartieDe($parent);
Regroupement d'événements — Evenement → Evenement. Un événement (une représentation) peut
pointer vers un événement « chapeau » (festival, week-end, cycle…) via
Evenement::setAPourEvenementParent(...), qui émet schema:superEvent ; le parent reçoit l'inverse
schema:subEvent. Le nœud chapeau est typé de façon générique schema:EventSeries via
setSchemaType() — le SDK n'émet jamais schema:Festival ni aucun sous-type métier. Si
l'intégrateur peut certifier la nature (un vrai festival), il ajoute lui-même le rdf:type.
<?php
$chapeau = new Evenement('https://mon-opera.fr/evenement/100'); // « Festival de danse »
$chapeau
->setSchemaType('schema:EventSeries') // typage générique — jamais schema:Festival côté SDK
->setDateDebut('2026-09-01T00:00:00+02:00')
->setDateFin('2026-09-30T23:59:59+02:00');
$repr = new Evenement('https://mon-opera.fr/evenement/200');
$repr->setAPourEvenementParent($chapeau); // → schema:superEvent <…/100> ; <…/100> schema:subEvent <…/200>
Propriétés de classes
Toutes les propriétés des classes héritant OntologyClass sont des ValueObject. Ainsi, les setter acceptent soit :
- une valeur primitive
- un tableau de valeurs primitives
- un
ValueObjectreprésentant une valeur - un
ValueObjectreprésentant une collection de valeurs
Le getter retourne toujours un ValueObject.
<?php
use CapDataOpera\PhpSdk\ValueObject\StringObject;
use CapDataOpera\PhpSdk\Model\Personne;
$personne = new Personne('https://mon-opera.fr/person/1');
// Appels possibles pour ajouter une propriété :
// - Le setter wrap la valeur dans un ValueObject
$personne->setNom('foo');
// - On peut aussi passer un tableau de valeurs
$personne->setNom(['foo', 'bar']);
// - On passe directement un ValueObject
$personne->setNom(new StringObject('foo'));
// - On passe directement un ValueObject avec le tableau de valeurs
$personne->setNom(new StringObject(['foo', 'bar']));
// Le getter retourne toujours un ValueObject
$personne->getNom(); // StringObject('foo')
Relations entre objets
Les relations entre objets sont représentées par des RelationObject qui sont des ValueObject qui représentent une collection.
Les RelationObject sont typés dès leur construction pour valider les données en entrée.
<?php
use CapDataOpera\PhpSdk\ValueObject\RelationObject;
use CapDataOpera\PhpSdk\Model\Fonction;
use CapDataOpera\PhpSdk\Model\Personne;
$fonction = new Fonction('https://mon-opera.fr/fonction/1');
$fonction2 = new Fonction('https://mon-opera.fr/fonction/2');
$personne = new Personne('https://mon-opera.fr/person/1');
// Appels possibles pour ajouter une relation :
// - Le setter wrap l'objet dans un RelationObject en définissant le type
$personne->setAPourFonction($fonction);
// - On peut aussi passer un tableau de valeurs
$personne->setAPourFonction([$fonction, $fonction2]);
// - On passe directement un RelationObject
$personne->setAPourFonction(new RelationObject($fonction, Fonction::class));
// - On passe directement un RelationObject avec le tableau de valeurs
$personne->setAPourFonction(new RelationObject([$fonction, $fonction2], Fonction::class));
Relations externes
Toutes les méthodes acceptant des RelationObject acceptent aussi des URI de ressources externes via
la class ExternalThing.
<?php
use CapDataOpera\PhpSdk\Model\Personne;
use CapDataOpera\PhpSdk\Model\ExternalThing;
$personne = new Personne('https://mon-opera.fr/person/1');
$personne->setAPourFonction(new ExternalThing('http://capdataculture.fr/graph/FONCTION/230'));
Voici les classes disponibles pour les relations externes :
CapDataOpera\PhpSdk\Model\ExternalThingCapDataOpera\PhpSdk\Model\IsniCapDataOpera\PhpSdk\Model\ArkBnf
Les objets créés avec ces classes n'ont pas besoin d'être ajoutés au graph pour être sérialisés.
Serialization des objets
Une fois les objets construits, vous devrez ajouter chaque objet à un Graph.
$graph = new Graph();
$address = new AdressePostale('https://mon-opera.fr/adresse/1');
$address
->setAdressePostale('1 place de la Comédie')
->setCodePostal('69001')
->setCommune('Lyon')
;
$ownOrg = new Collectivite('https://mon-opera.fr/organization/1');
$ownOrg->setNom('Mon opéra de test')
->setFacebook('https://facebook.com/mon-opera')
->setSiteWeb('https://mon-opera.fr')
->setAdresse($address)
->setCatalogageSourceAgence($ownOrg)
->setDateCreationRessource(new \DateTimeImmutable('2022-01-30T00:00:00+00:00'))
->setDateModificationRessource(new \DateTimeImmutable('2024-01-30T00:00:00+00:00'))
->setIsni(new Isni('https://isni.org/isni/0000000122982840'));
$graph->add($address);
$graph->add($ownOrg);
Le graph enregistre chaque URI d'objet ajouté pour éviter les doublons, mais aussi pour valider si chaque relation vers une ressource interne est bien enregistrée dans le graph.
Une fois le graph construit, le serializer va convertir chaque objet en RDF via la librairie EasyRdf
et créer les triplets selon les ontologies https://ontologie.capdataculture.fr/v1/, https://schema.org/, etc.
Cette étape est opérée par les Converter et les LiteralConverter qui sont responsables de la conversion via le
pattern Chain of Responsibility.
La classe CapDataOpera\PhpSdk\Serializer\Serializer est, par défaut, configurée avec une liste de Converter et de LiteralConverter. Mais vous pouvez
configurer vos propres Converter et LiteralConverter pour ajouter des propriétés ou des classes à votre RDF.
<?php
use CapDataOpera\PhpSdk\Serializer\Serializer;
// Serializer avec les converters par défaut
$serializer = new Serializer();
// Serializer des converters personnalisés
$serializer = new Serializer(
[
new MyCustomObjectConverter(),
],
[
new MyCustomLiteralConverter(),
]
);
Enfin, une fois le graph convertit en RDF, vous pouvez le sérialiser dans le format de votre choix. Il s'agit des formats supportés par EasyRdf : https://www.easyrdf.org/docs/api/EasyRdf/Serialiser.html#method_serialise
<?php
// La méthode serialize effectue la conversion, la validation puis la sérialisation
echo $serializer->serialize($graph, 'turtle', ['capdata']);
Ajouter des propriétés personnalisées
Vous avez la possibilité d'ajouter des propriétés personnalisées n'importe où
dans votre Graph en utilisant la méthode addResource :
<?php
use CapDataOpera\PhpSdk\Graph\Graph;
use CapDataOpera\PhpSdk\Model\Collectivite;
use CapDataOpera\PhpSdk\Model\Isni;
use CapDataOpera\PhpSdk\Serializer\Serializer;
$serializer = new Serializer();
$graph = new Graph();
$ownOrg = new Collectivite('https://mon-opera.fr/organization/1');
$ownOrg->setNom('Mon opéra de test')
->setFacebook('https://facebook.com/mon-opera')
->setSiteWeb('https://mon-opera.fr')
->setCatalogageSourceAgence($ownOrg)
->setDateCreationRessource(new \DateTimeImmutable('2022-01-30T00:00:00+00:00'))
->setDateModificationRessource(new \DateTimeImmutable('2024-01-30T00:00:00+00:00'))
->setIsni(new Isni('https://isni.org/isni/0000000122982840'));
$graph->add($ownOrg);
/**
* Ajout d'une propriété personnalisée sur l'objet Collectivite
*/
$graph->addResource(
'https://mon-opera.fr/organization/1',
'https://schema.org/startDate',
new Literal('2016-04-21T20:00', null, 'xsd:dateTime')
);
echo $serializer->serialize($graph, 'turtle', ['capdata']);
Choisir les ontologies pour la sérialisation
La méthode serialize accepte un tableau de chaînes de caractères pour choisir les ontologies à utiliser pour la sérialisation.
Les ontologies disponibles sont :
capdata: https://ontologie.capdataculture.fr/v1/schema: https://schema.org/datatourisme: https://www.datatourisme.fr/ontology/core
Par défaut, le serializer utilise l'ontologie capdata uniquement.
Vous pouvez passer les clés sous forme de chaînes ('capdata', 'schema', 'datatourisme') ou bien
utiliser les constantes de la classe CapDataOpera\PhpSdk\Ontology, qui sont à privilégier.
<?php
use CapDataOpera\PhpSdk\Ontology;
use CapDataOpera\PhpSdk\Serializer\Serializer;
$serializer = new Serializer();
$graph = new Graph();
// ...
// Par défaut, exporte uniquement les classes et propriétés de l'ontologie capdata au format Turtle
echo $serializer->serialize($graph, 'turtle'/*, [Ontology::CAPDATA] */);
// Plusieurs ontologies sont utilisées
echo $serializer->serialize($graph, 'turtle', [Ontology::CAPDATA, Ontology::SCHEMA]);
// Toutes les ontologies : capdata + schema + datatourisme
echo $serializer->serialize($graph, 'turtle', Ontology::all());
// Exporte uniquement les classes et propriétés de l'ontologie schema.org au format LD-JSON pour le web sémantique
// L'export au format LD-JSON nécessite la librairie ml/json-ld: composer require ml/json-ld
echo $serializer->serialize($graph, 'jsonld', [Ontology::SCHEMA]);
Vous pouvez aussi définir les ontologies utilisées par défaut, soit à la construction du Serializer,
soit via setDefaultOntologies (par exemple pour basculer en mode schema-first) :
<?php
use CapDataOpera\PhpSdk\Ontology;
use CapDataOpera\PhpSdk\Serializer\Serializer;
// Le 3e argument définit les ontologies par défaut
$serializer = new Serializer([], [], [Ontology::SCHEMA]);
// ... ou plus tard
$serializer->setDefaultOntologies([Ontology::CAPDATA, Ontology::SCHEMA]);
Toutes les classes CapData n'ont pas d'équivalent DataTourisme : les modèles propres au spectacle vivant (
Production,Oeuvre,Saison,Participation) ne sont volontairement pas émis dans la sortiedatatourisme.
Comment contribuer au projet
Veuillez lire CONTRIBUTING.md pour plus de détails sur notre code de conduite, et le processus pour soumettre une pull-request ou une issue.
Crédits
Développements réalisés dans le cadre du projet CapData Opéra - France 2030, porté par la Réunion des Opéras de France. Opération soutenue par l'État dans le cadre du dispositif « Expérience augmentée du spectacle vivant » de France 2030, opéré par la Caisse des Dépôts. Information sur https://www.rof.fr/rof/capdata-opera.aspx.
Conception et développement du SDK PHP : Rezo Zero - https://www.rezo-zero.com/
capdataopera/php-sdk 适用场景与选型建议
capdataopera/php-sdk 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.18k 次下载、GitHub Stars 达 1, 最近一次更新时间为 2024 年 02 月 23 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「sdk」 「RDF」 「ontology」 「Opera」 「capdata」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 capdataopera/php-sdk 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 capdataopera/php-sdk 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 capdataopera/php-sdk 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.
Wikibase extension that allows defining RDF mappings for Wikibase Entities
The missing link between EasyRDF and Guzzle
Super lightweight classes and tools for developing RDF gateways
RDF in-memory quad store implementation using PDO and SQLite.
EvoLayer Base — AI agents, ontology, and premium React blocks for the Laravel React Inertia starter. Part of the EvoDevOps starter-kit family.
统计信息
- 总下载量: 1.18k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 18
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: CC-BY-SA-4.0
- 更新时间: 2024-02-23
