Skip to content

Commit f1fbcdb

Browse files
author
Christian Schmidt
committed
Add mapping driver factory
1 parent 9677500 commit f1fbcdb

File tree

1 file changed

+43
-37
lines changed

1 file changed

+43
-37
lines changed

src/Dflydev/Provider/DoctrineOrm/DoctrineOrmServiceProvider.php

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -146,50 +146,19 @@ public function register(Container $container)
146146

147147
$chain = $container['orm.mapping_driver_chain.locator']($name);
148148

149-
foreach ((array) $options['mappings'] as $entity) {
150-
if (!is_array($entity)) {
149+
foreach ((array) $options['mappings'] as $mappingOptions) {
150+
if (!is_array($mappingOptions)) {
151151
throw new \InvalidArgumentException(
152152
"The 'orm.em.options' option 'mappings' should be an array of arrays."
153153
);
154154
}
155155

156-
if (isset($entity['alias'])) {
157-
$config->addEntityNamespace($entity['alias'], $entity['namespace']);
156+
if (isset($mappingOptions['alias'])) {
157+
$config->addEntityNamespace($mappingOptions['alias'], $mappingOptions['namespace']);
158158
}
159159

160-
switch ($entity['type']) {
161-
case 'annotation':
162-
$useSimpleAnnotationReader =
163-
isset($entity['use_simple_annotation_reader'])
164-
? $entity['use_simple_annotation_reader']
165-
: true;
166-
$driver = $config->newDefaultAnnotationDriver((array) $entity['path'], $useSimpleAnnotationReader);
167-
$chain->addDriver($driver, $entity['namespace']);
168-
break;
169-
case 'yml':
170-
$driver = new YamlDriver($entity['path']);
171-
$chain->addDriver($driver, $entity['namespace']);
172-
break;
173-
case 'simple_yml':
174-
$driver = new SimplifiedYamlDriver(array($entity['path'] => $entity['namespace']));
175-
$chain->addDriver($driver, $entity['namespace']);
176-
break;
177-
case 'xml':
178-
$driver = new XmlDriver($entity['path']);
179-
$chain->addDriver($driver, $entity['namespace']);
180-
break;
181-
case 'simple_xml':
182-
$driver = new SimplifiedXmlDriver(array($entity['path'] => $entity['namespace']));
183-
$chain->addDriver($driver, $entity['namespace']);
184-
break;
185-
case 'php':
186-
$driver = new StaticPHPDriver($entity['path']);
187-
$chain->addDriver($driver, $entity['namespace']);
188-
break;
189-
default:
190-
throw new \InvalidArgumentException(sprintf('"%s" is not a recognized driver', $entity['type']));
191-
break;
192-
}
160+
$driver = $container['orm.mapping.factory']($mappingOptions['type'], $config, $mappingOptions);
161+
$chain->addDriver($driver, $mappingOptions['namespace']);
193162
}
194163
$config->setMetadataDriverImpl($chain);
195164

@@ -207,6 +176,43 @@ public function register(Container $container)
207176
return $configs;
208177
};
209178

179+
$container['orm.mapping.factory.annotation'] = $container->protect(function(Configuration $config, $mappingOptions) {
180+
$useSimpleAnnotationReader =
181+
isset($mappingOptions['use_simple_annotation_reader'])
182+
? $mappingOptions['use_simple_annotation_reader']
183+
: true;
184+
return $config->newDefaultAnnotationDriver((array) $mappingOptions['path'], $useSimpleAnnotationReader);
185+
});
186+
187+
$container['orm.mapping.factory.yml'] = $container->protect(function(Configuration $config, $mappingOptions) {
188+
return new YamlDriver($mappingOptions['path']);
189+
});
190+
191+
$container['orm.mapping.factory.simple_yml'] = $container->protect(function(Configuration $config, $mappingOptions) {
192+
return new SimplifiedYamlDriver(array($mappingOptions['path'] => $mappingOptions['namespace']));
193+
});
194+
195+
$container['orm.mapping.factory.xml'] = $container->protect(function(Configuration $config, $mappingOptions) {
196+
return new XmlDriver($mappingOptions['path']);
197+
});
198+
199+
$container['orm.mapping.factory.simple_xml'] = $container->protect(function(Configuration $config, $mappingOptions) {
200+
return new YamlDriver($mappingOptions['path']);
201+
});
202+
203+
$container['orm.mapping.factory.php'] = $container->protect(function(Configuration $config, $mappingOptions) {
204+
return new YamlDriver($mappingOptions['path']);
205+
});
206+
207+
$container['orm.mapping.factory'] = $container->protect(function ($driver, Configuration $config, $mappingOptions) use ($container) {
208+
$mappingFactoryKey = 'orm.mapping.factory.'.$driver;
209+
if (!isset($container[$mappingFactoryKey])) {
210+
throw new \RuntimeException("Factory '$mappingFactoryKey' for mapping type '$driver' not defined");
211+
}
212+
213+
return $container[$mappingFactoryKey]($config, $mappingOptions);
214+
});
215+
210216
$container['orm.cache.configurer'] = $container->protect(function ($name, Configuration $config, $options) use ($container) {
211217
$config->setMetadataCacheImpl($container['orm.cache.locator']($name, 'metadata', $options));
212218
$config->setQueryCacheImpl($container['orm.cache.locator']($name, 'query', $options));

0 commit comments

Comments
 (0)