Skip to content

Commit 06341c5

Browse files
authored
Add options for fileExtension and XSD validation in XML mapping (#126)
1 parent 43aabeb commit 06341c5

File tree

5 files changed

+27
-7
lines changed

5 files changed

+27
-7
lines changed

.docs/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ nettrine.orm:
9393
type: <attributes|xml>
9494
directories: <string[]>
9595
namespace: <string>
96+
options:
97+
fileExtension: <string>
98+
xsdValidation: <boolean>
9699
97100
defaultCache: <class-string|service>
98101
queryCache: <class-string|service>
@@ -371,8 +374,13 @@ nettrine.orm:
371374
type: xml
372375
directories: [%appDir%/Database]
373376
namespace: App\Database
377+
options:
378+
fileExtension: .orm.xml
379+
xsdValidation: true
374380
```
375381

382+
Setting `xsdValidation` to `false` will allow using custom XML elements in mapping files, as used by some behavior extensions (e.g. gedmo:sortable-position).
383+
376384
### Helper
377385

378386
You can use `MappingHelper` to add multiple mappings at once. This is useful when you have multiple modules with entities.

src/DI/OrmExtension.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,28 @@
2121
/**
2222
* @property-read stdClass $config
2323
* @phpstan-type TManagerConfig object{
24-
* entityManagerDecoratorClass: string,
24+
* entityManagerDecoratorClass: string|null,
2525
* configurationClass: string,
2626
* lazyNativeObjects: bool|null,
2727
* proxyDir: string|null,
2828
* autoGenerateProxyClasses: int|bool|Statement,
2929
* proxyNamespace: string|null,
30-
* metadataDriverImpl: string,
30+
* metadataDriverImpl: string|null,
3131
* entityNamespaces: array<string, string>,
3232
* resolveTargetEntities: array<string, string>,
3333
* customStringFunctions: array<string, string>,
3434
* customNumericFunctions: array<string, string>,
3535
* customDatetimeFunctions: array<string, string>,
3636
* customHydrationModes: array<string, string>,
37-
* classMetadataFactoryName: string,
38-
* defaultRepositoryClassName: string,
37+
* classMetadataFactoryName: string|null,
38+
* defaultRepositoryClassName: string|null,
3939
* namingStrategy: string|Statement|null,
4040
* quoteStrategy: string|Statement|null,
4141
* entityListenerResolver: string|Statement|null,
4242
* repositoryFactory: string|Statement|null,
4343
* defaultQueryHints: array<string, mixed>,
4444
* filters: array<string, object{class: string, enabled: bool}>,
45-
* mapping: array<string, object{type: 'attributes'|'xml', directories: string[], namespace: string}>,
45+
* mapping: array<string, object{type: 'attributes'|'xml', directories: string[], namespace: string, options: object{fileExtension: string, xsdValidation: bool}}>,
4646
* defaultCache: string|Statement|null,
4747
* queryCache: string|Statement|null,
4848
* resultCache: string|Statement|null,
@@ -128,6 +128,10 @@ public function getConfigSchema(): Schema
128128
'type' => Expect::anyOf('attributes', 'xml')->default('attributes'),
129129
'directories' => Expect::listOf(Expect::string())->min(1)->required(),
130130
'namespace' => Expect::string()->required(),
131+
'options' => Expect::structure([
132+
'fileExtension' => Expect::string()->default('.orm.xml'),
133+
'xsdValidation' => Expect::bool()->default(true),
134+
]),
131135
]),
132136
Expect::string()
133137
)->default([]),

src/DI/Pass/ManagerPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ public function loadManagerConfiguration(string $managerName, mixed $managerConf
277277
]);
278278
} elseif ($mapping->type === 'xml') {
279279
$mappingDriver->addSetup('addDriver', [
280-
new Statement(SimplifiedXmlDriver::class, [array_combine($mapping->directories, array_fill(0, count($mapping->directories), $mapping->namespace))]),
280+
new Statement(SimplifiedXmlDriver::class, [array_combine($mapping->directories, array_fill(0, count($mapping->directories), $mapping->namespace)), $mapping->options->fileExtension, $mapping->options->xsdValidation]),
281281
$mapping->namespace,
282282
]);
283283
} else {

tests/Cases/DI/OrmExtension.mapping.phpt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ Toolkit::test(function (): void {
9292
type: xml
9393
directories: [%fixturesDir%/Entity, %fixturesDir%/../Toolkit]
9494
namespace: Tests\Mocks\Dummy
95+
options:
96+
fileExtension: .custom.xml
97+
xsdValidation: false
9598
NEON
9699
));
97100
})
@@ -107,6 +110,10 @@ Toolkit::test(function (): void {
107110
Assert::type(SimplifiedXmlDriver::class, $xmlDriver);
108111
Assert::equal([], $xmlDriver->getAllClassNames());
109112
Assert::count(2, $xmlDriver->getLocator()->getPaths());
113+
Assert::equal('.custom.xml', $xmlDriver->getLocator()->getFileExtension());
114+
115+
$r = (new ReflectionClass($xmlDriver))->getParentClass();
116+
Assert::false($r->getProperty('isXsdValidationEnabled')->getValue($xmlDriver));
110117
});
111118

112119
// Driver: all

tests/Cases/DI/OrmExtension.proxy.phpt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ Toolkit::test(function (): void {
141141
// Skip on PHP < 8.4 OR doctrine/orm < v3.4.0
142142
if (PHP_VERSION_ID < 80400 || !method_exists(Configuration::class, 'enableNativeLazyObjects')) {
143143
Assert::true(true);
144+
144145
return;
145146
}
146147

147-
$builder = ContainerBuilder::of()
148+
$container = ContainerBuilder::of()
148149
->withCompiler(function (Compiler $compiler): void {
149150
$compiler->addExtension('nettrine.dbal', new DbalExtension());
150151
$compiler->addExtension('nettrine.orm', new OrmExtension());

0 commit comments

Comments
 (0)