Skip to content

Commit 45bb9eb

Browse files
authored
Make XSD more strict for other Document types (#2766)
1 parent 953815f commit 45bb9eb

File tree

4 files changed

+93
-6
lines changed

4 files changed

+93
-6
lines changed

doctrine-mongo-mapping.xsd

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,80 @@
1616
<xs:complexType>
1717
<xs:choice minOccurs="0" maxOccurs="unbounded">
1818
<xs:element name="document" type="odm:document" minOccurs="0" maxOccurs="unbounded" />
19-
<xs:element name="embedded-document" type="odm:document" minOccurs="0" maxOccurs="unbounded" />
20-
<xs:element name="mapped-superclass" type="odm:document" minOccurs="0" maxOccurs="unbounded" />
21-
<xs:element name="query-result-document" type="odm:document" minOccurs="0" maxOccurs="unbounded" />
19+
<xs:element name="embedded-document" type="odm:embedded-document" minOccurs="0" maxOccurs="unbounded" />
20+
<xs:element name="mapped-superclass" type="odm:mapped-superclass" minOccurs="0" maxOccurs="unbounded" />
21+
<xs:element name="query-result-document" type="odm:query-result-document" minOccurs="0" maxOccurs="unbounded" />
2222
<xs:element name="view" type="odm:view" minOccurs="0" maxOccurs="unbounded" />
2323
<xs:element name="gridfs-file" type="odm:gridfs-file" minOccurs="0" maxOccurs="unbounded" />
2424
</xs:choice>
2525
</xs:complexType>
2626
</xs:element>
2727

2828
<xs:complexType name="embedded-document">
29-
<xs:attribute name="name" type="xs:NMTOKEN" />
29+
<xs:choice minOccurs="0" maxOccurs="unbounded">
30+
<xs:element name="id" type="odm:id" minOccurs="0" />
31+
<xs:element name="field" type="odm:field" minOccurs="0" maxOccurs="unbounded" />
32+
<xs:element name="embed-one" type="odm:embed-one" minOccurs="0" maxOccurs="unbounded" />
33+
<xs:element name="embed-many" type="odm:embed-many" minOccurs="0" maxOccurs="unbounded" />
34+
<xs:element name="reference-one" type="odm:reference-one" minOccurs="0" maxOccurs="unbounded" />
35+
<xs:element name="reference-many" type="odm:reference-many" minOccurs="0" maxOccurs="unbounded" />
36+
<xs:element name="discriminator-field" type="odm:discriminator-field" minOccurs="0" />
37+
<xs:element name="discriminator-map" type="odm:discriminator-map" minOccurs="0" />
38+
<xs:element name="default-discriminator-value" type="odm:default-discriminator-value" minOccurs="0" />
39+
<xs:element name="lifecycle-callbacks" type="odm:lifecycle-callbacks" minOccurs="0" />
40+
<xs:element name="also-load-methods" type="odm:also-load-methods" minOccurs="0" />
41+
<xs:element name="indexes" type="odm:indexes" minOccurs="0" />
42+
</xs:choice>
43+
44+
<xs:attribute name="name" type="xs:string" />
45+
<xs:attribute name="inheritance-type" type="odm:inheritance-type" />
3046
</xs:complexType>
3147

3248
<xs:complexType name="mapped-superclass">
33-
<xs:attribute name="name" type="xs:NMTOKEN" />
49+
<xs:choice minOccurs="0" maxOccurs="unbounded">
50+
<xs:element name="id" type="odm:id" minOccurs="0" />
51+
<xs:element name="field" type="odm:field" minOccurs="0" maxOccurs="unbounded" />
52+
<xs:element name="embed-one" type="odm:embed-one" minOccurs="0" maxOccurs="unbounded" />
53+
<xs:element name="embed-many" type="odm:embed-many" minOccurs="0" maxOccurs="unbounded" />
54+
<xs:element name="reference-one" type="odm:reference-one" minOccurs="0" maxOccurs="unbounded" />
55+
<xs:element name="reference-many" type="odm:reference-many" minOccurs="0" maxOccurs="unbounded" />
56+
<xs:element name="discriminator-field" type="odm:discriminator-field" minOccurs="0" />
57+
<xs:element name="discriminator-map" type="odm:discriminator-map" minOccurs="0" />
58+
<xs:element name="default-discriminator-value" type="odm:default-discriminator-value" minOccurs="0" />
59+
<xs:element name="lifecycle-callbacks" type="odm:lifecycle-callbacks" minOccurs="0" />
60+
<xs:element name="also-load-methods" type="odm:also-load-methods" minOccurs="0" />
61+
<xs:element name="indexes" type="odm:indexes" minOccurs="0" />
62+
</xs:choice>
63+
64+
<xs:attribute name="db" type="xs:NMTOKEN" />
65+
<xs:attribute name="name" type="xs:string" />
66+
<xs:attribute name="write-concern" type="xs:string" />
67+
<xs:attribute name="collection" type="xs:NMTOKEN" />
68+
<xs:attribute name="capped-collection" type="xs:boolean" />
69+
<xs:attribute name="capped-collection-size" type="xs:integer" />
70+
<xs:attribute name="capped-collection-max" type="xs:integer" />
71+
<xs:attribute name="repository-class" type="xs:string" />
72+
<xs:attribute name="inheritance-type" type="odm:inheritance-type" />
73+
<xs:attribute name="change-tracking-policy" type="odm:change-tracking-policy" />
74+
<xs:attribute name="read-only" type="xs:boolean" />
3475
</xs:complexType>
3576

3677
<xs:complexType name="query-result-document">
37-
<xs:attribute name="name" type="xs:NMTOKEN" />
78+
<xs:choice minOccurs="0" maxOccurs="unbounded">
79+
<xs:element name="id" type="odm:id" minOccurs="0" />
80+
<xs:element name="field" type="odm:field" minOccurs="0" maxOccurs="unbounded" />
81+
<xs:element name="embed-one" type="odm:embed-one" minOccurs="0" maxOccurs="unbounded" />
82+
<xs:element name="embed-many" type="odm:embed-many" minOccurs="0" maxOccurs="unbounded" />
83+
<xs:element name="reference-one" type="odm:reference-one" minOccurs="0" maxOccurs="unbounded" />
84+
<xs:element name="reference-many" type="odm:reference-many" minOccurs="0" maxOccurs="unbounded" />
85+
<xs:element name="discriminator-field" type="odm:discriminator-field" minOccurs="0" />
86+
<xs:element name="discriminator-map" type="odm:discriminator-map" minOccurs="0" />
87+
<xs:element name="default-discriminator-value" type="odm:default-discriminator-value" minOccurs="0" />
88+
<xs:element name="lifecycle-callbacks" type="odm:lifecycle-callbacks" minOccurs="0" />
89+
<xs:element name="also-load-methods" type="odm:also-load-methods" minOccurs="0" />
90+
</xs:choice>
91+
92+
<xs:attribute name="name" type="xs:string" />
3893
</xs:complexType>
3994

4095
<xs:complexType name="view">

tests/Doctrine/ODM/MongoDB/Tests/Mapping/Driver/XmlDriverTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use MongoDB\BSON\Document;
1111
use TestDocuments\AlsoLoadDocument;
1212
use TestDocuments\CustomIdGenerator;
13+
use TestDocuments\InvalidEmbeddedDocument;
1314
use TestDocuments\InvalidPartialFilterDocument;
1415
use TestDocuments\SchemaInvalidDocument;
1516
use TestDocuments\SchemaValidatedDocument;
@@ -75,6 +76,16 @@ public function testInvalidPartialFilterExpressions(): void
7576
$this->driver->loadMetadataForClass(InvalidPartialFilterDocument::class, $classMetadata);
7677
}
7778

79+
public function testInvalidEmbeddedDocument(): void
80+
{
81+
$classMetadata = new ClassMetadata(InvalidEmbeddedDocument::class);
82+
83+
$this->expectException(MappingException::class);
84+
$this->expectExceptionMessageMatches('#The mapping file .+ is invalid#');
85+
86+
$this->driver->loadMetadataForClass(InvalidEmbeddedDocument::class, $classMetadata);
87+
}
88+
7889
public function testWildcardIndexName(): void
7990
{
8091
$classMetadata = new ClassMetadata(WildcardIndexDocument::class);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TestDocuments;
6+
7+
class InvalidEmbeddedDocument
8+
{
9+
public string $id;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<doctrine-mongo-mapping xmlns="http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping
6+
http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping.xsd">
7+
8+
<embedded-document name="TestDocuments\InvalidEmbeddedDocument" collection="embeddedDocument">
9+
<id />
10+
</embedded-document>
11+
</doctrine-mongo-mapping>

0 commit comments

Comments
 (0)