@@ -37,37 +37,43 @@ final class SchemaFactory implements SchemaFactoryInterface, SchemaFactoryAwareI
3737 use SchemaUriPrefixTrait;
3838
3939 private const ITEM_BASE_SCHEMA_NAME = 'HydraItemBaseSchema ' ;
40+ private const ITEM_BASE_SCHEMA_OUTPUT_NAME = 'HydraOutputBaseSchema ' ;
4041 private const COLLECTION_BASE_SCHEMA_NAME = 'HydraCollectionBaseSchema ' ;
4142 private const BASE_PROP = [
42- 'readOnly ' => true ,
4343 'type ' => 'string ' ,
4444 ];
4545 private const BASE_PROPS = [
4646 '@id ' => self ::BASE_PROP ,
4747 '@type ' => self ::BASE_PROP ,
4848 ];
49- private const BASE_ROOT_PROPS = [
50- '@context ' => [
51- 'readOnly ' => true ,
52- 'oneOf ' => [
53- ['type ' => 'string ' ],
54- [
55- 'type ' => 'object ' ,
56- 'properties ' => [
57- '@vocab ' => [
58- 'type ' => 'string ' ,
59- ],
60- 'hydra ' => [
61- 'type ' => 'string ' ,
62- 'enum ' => [ContextBuilder::HYDRA_NS ],
49+ private const ITEM_BASE_SCHEMA = [
50+ 'type ' => 'object ' ,
51+ 'properties ' => [
52+ '@context ' => [
53+ 'oneOf ' => [
54+ ['type ' => 'string ' ],
55+ [
56+ 'type ' => 'object ' ,
57+ 'properties ' => [
58+ '@vocab ' => [
59+ 'type ' => 'string ' ,
60+ ],
61+ 'hydra ' => [
62+ 'type ' => 'string ' ,
63+ 'enum ' => [ContextBuilder::HYDRA_NS ],
64+ ],
6365 ],
66+ 'required ' => ['@vocab ' , 'hydra ' ],
67+ 'additionalProperties ' => true ,
6468 ],
65- 'required ' => ['@vocab ' , 'hydra ' ],
66- 'additionalProperties ' => true ,
6769 ],
68- ],
70+ ] + self :: BASE_PROPS ,
6971 ],
70- ] + self ::BASE_PROPS ;
72+ ];
73+
74+ private const ITEM_BASE_SCHEMA_OUTPUT = [
75+ 'required ' => ['@id ' , '@type ' ],
76+ ] + self ::ITEM_BASE_SCHEMA ;
7177
7278 /**
7379 * @param array<string, mixed> $defaultContext
@@ -126,13 +132,14 @@ public function buildSchema(string $className, string $format = 'jsonld', string
126132
127133 $ key = $ schema ->getRootDefinitionKey () ?? $ collectionKey ;
128134
129- if (!isset ($ definitions [self ::ITEM_BASE_SCHEMA_NAME ])) {
130- $ definitions [self ::ITEM_BASE_SCHEMA_NAME ] = ['type ' => 'object ' , 'properties ' => self ::BASE_ROOT_PROPS ];
135+ $ name = Schema::TYPE_OUTPUT === $ type ? self ::ITEM_BASE_SCHEMA_NAME : self ::ITEM_BASE_SCHEMA_OUTPUT_NAME ;
136+ if (!isset ($ definitions [$ name ])) {
137+ $ definitions [$ name ] = Schema::TYPE_OUTPUT === $ type ? self ::ITEM_BASE_SCHEMA_OUTPUT : self ::ITEM_BASE_SCHEMA ;
131138 }
132139
133140 $ definitions [$ definitionName ] = [
134141 'allOf ' => [
135- ['$ref ' => $ prefix .self :: ITEM_BASE_SCHEMA_NAME ],
142+ ['$ref ' => $ prefix .$ name ],
136143 ['$ref ' => $ prefix .$ key ],
137144 ],
138145 ];
0 commit comments