Skip to content

Commit f3afc8b

Browse files
committed
Merge pull request #22 from c960657/more-config-options
Support remaining config options
2 parents 3e5aaad + 139dc43 commit f3afc8b

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ Configuration
230230
String or array describing metadata cache implementation.
231231
* **result_cache** (Default: setting specified by orm.default_cache):
232232
String or array describing result cache implementation.
233+
* **hydration_cache** (Default: setting specified by orm.default_cache):
234+
String or array describing hydration cache implementation.
233235
* **types**
234236
An array of custom types in the format of 'typeName' => 'Namespace\To\Type\Class'
235237
* **orm.ems.options**:
@@ -268,6 +270,13 @@ Configuration
268270
String defining namespace in which Doctrine generated proxies should reside.
269271
* **orm.auto_generate_proxies**:
270272
Boolean defining whether or not proxies should be generated automatically.
273+
* **orm.class_metadata_factory_name**: Class name of class metadata factory.
274+
Class implements `Doctrine\Common\Persistence\Mapping\ClassMetadataFactory`.
275+
* **orm.default_repository_class**: Class name of default repository.
276+
Class implements `Doctrine\Common\Persistence\ObjectRepository`.
277+
* **orm.repository_factory**: Repository factory, instance `Doctrine\ORM\Repository\RepositoryFactory`.
278+
* **orm.entity_listener_resolver**: Entity listener resolver, instance
279+
`Doctrine\ORM\Mapping\EntityListenerResolver`.
271280
* **orm.default_cache**:
272281
String or array describing default cache implementation.
273282
* **orm.add_mapping_driver**:
@@ -322,6 +331,15 @@ Configuration
322331
return $config;
323332
}));
324333
```
334+
* **orm.strategy**:
335+
* **naming**: Naming strategy, instance `Doctrine\ORM\Mapping\NamingStrategy`.
336+
* **quote**: Quote strategy, instance `Doctrine\ORM\Mapping\QuoteStrategy`.
337+
* **orm.custom.functions**:
338+
* **string**, **numeric**, **datetime**: Custom DQL functions, array of class names indexed by DQL function name.
339+
Classes are subclasses of `Doctrine\ORM\Query\AST\Functions\FunctionNode`.
340+
* **hydration_modes**: Hydrator class names, indexed by hydration mode name.
341+
Classes are subclasses of `Doctrine\ORM\Internal\Hydration\AbstractHydrator`.
342+
325343

326344
### Services
327345

src/Dflydev/Pimple/Provider/DoctrineOrm/DoctrineOrmServiceProvider.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@
2424
use Doctrine\DBAL\Types\Type;
2525
use Doctrine\ORM\Configuration;
2626
use Doctrine\ORM\EntityManager;
27+
use Doctrine\ORM\Mapping\DefaultEntityListenerResolver;
28+
use Doctrine\ORM\Mapping\DefaultNamingStrategy;
29+
use Doctrine\ORM\Mapping\DefaultQuoteStrategy;
2730
use Doctrine\ORM\Mapping\Driver\Driver;
2831
use Doctrine\ORM\Mapping\Driver\XmlDriver;
2932
use Doctrine\ORM\Mapping\Driver\YamlDriver;
3033
use Doctrine\ORM\Mapping\Driver\StaticPHPDriver;
34+
use Doctrine\ORM\Repository\DefaultRepositoryFactory;
3135

3236
/**
3337
* Doctrine ORM Pimple Service Provider.
@@ -121,6 +125,20 @@ public function register(\Pimple $app)
121125
$config->setProxyNamespace($app['orm.proxies_namespace']);
122126
$config->setAutoGenerateProxyClasses($app['orm.auto_generate_proxies']);
123127

128+
$config->setCustomStringFunctions($app['orm.custom.functions.string']);
129+
$config->setCustomNumericFunctions($app['orm.custom.functions.numeric']);
130+
$config->setCustomDatetimeFunctions($app['orm.custom.functions.datetime']);
131+
$config->setCustomHydrationModes($app['orm.custom.hydration_modes']);
132+
133+
$config->setClassMetadataFactoryName($app['orm.class_metadata_factory_name']);
134+
$config->setDefaultRepositoryClassName($app['orm.default_repository_class']);
135+
136+
$config->setEntityListenerResolver($app['orm.entity_listener_resolver']);
137+
$config->setRepositoryFactory($app['orm.repository_factory']);
138+
139+
$config->setNamingStrategy($app['orm.strategy.naming']);
140+
$config->setQuoteStrategy($app['orm.strategy.quote']);
141+
124142
$chain = $app['orm.mapping_driver_chain.locator']($name);
125143
foreach ((array) $options['mappings'] as $entity) {
126144
if (!is_array($entity)) {
@@ -183,6 +201,7 @@ public function register(\Pimple $app)
183201
$config->setMetadataCacheImpl($app['orm.cache.locator']($name, 'metadata', $options));
184202
$config->setQueryCacheImpl($app['orm.cache.locator']($name, 'query', $options));
185203
$config->setResultCacheImpl($app['orm.cache.locator']($name, 'result', $options));
204+
$config->setHydrationCacheImpl($app['orm.cache.locator']($name, 'hydration', $options));
186205
});
187206

188207
$app['orm.cache.locator'] = $app->protect(function($name, $cacheName, $options) use ($app) {
@@ -355,6 +374,22 @@ public function register(\Pimple $app)
355374
return $mapping;
356375
});
357376

377+
$app['orm.strategy.naming'] = $app->share(function($app) {
378+
return new DefaultNamingStrategy;
379+
});
380+
381+
$app['orm.strategy.quote'] = $app->share(function($app) {
382+
return new DefaultQuoteStrategy;
383+
});
384+
385+
$app['orm.entity_listener_resolver'] = $app->share(function($app) {
386+
return new DefaultEntityListenerResolver;
387+
});
388+
389+
$app['orm.repository_factory'] = $app->share(function($app) {
390+
return new DefaultRepositoryFactory;
391+
});
392+
358393
$app['orm.em'] = $app->share(function($app) {
359394
$ems = $app['orm.ems'];
360395

@@ -382,6 +417,12 @@ protected function getOrmDefaults(\Pimple $app)
382417
'orm.proxies_namespace' => 'DoctrineProxy',
383418
'orm.auto_generate_proxies' => true,
384419
'orm.default_cache' => 'array',
420+
'orm.custom.functions.string' => array(),
421+
'orm.custom.functions.numeric' => array(),
422+
'orm.custom.functions.datetime' => array(),
423+
'orm.custom.hydration_modes' => array(),
424+
'orm.class_metadata_factory_name' => 'Doctrine\ORM\Mapping\ClassMetadataFactory',
425+
'orm.default_repository_class' => 'Doctrine\ORM\EntityRepository',
385426
);
386427
}
387428
}

tests/Dflydev/Pimple/Provider/DoctrineOrm/DoctrineOrmServiceProviderTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public function testRegisterDefaultImplementations()
6565
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $app['orm.em.config']->getQueryCacheImpl());
6666
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $app['orm.em.config']->getResultCacheImpl());
6767
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $app['orm.em.config']->getMetadataCacheImpl());
68+
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $app['orm.em.config']->getHydrationCacheImpl());
6869
$this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain', $app['orm.em.config']->getMetadataDriverImpl());
6970
}
7071

@@ -122,13 +123,29 @@ public function testProxyConfigurationDefined()
122123
$doctrineOrmServiceProvider = new DoctrineOrmServiceProvider;
123124
$doctrineOrmServiceProvider->register($app);
124125

126+
$entityRepositoryClassName = get_class($this->getMock('Doctrine\Common\Persistence\ObjectRepository'));
127+
$metadataFactoryName = get_class($this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory'));
128+
129+
$entityListenerResolver = $this->getMock('Doctrine\ORM\Mapping\EntityListenerResolver');
130+
$repositoryFactory = $this->getMock('Doctrine\ORM\Repository\RepositoryFactory');
131+
125132
$app['orm.proxies_dir'] = '/path/to/proxies';
126133
$app['orm.proxies_namespace'] = 'TestDoctrineOrmProxiesNamespace';
127134
$app['orm.auto_generate_proxies'] = false;
135+
$app['orm.class_metadata_factory_name'] = $metadataFactoryName;
136+
$app['orm.default_repository_class'] = $entityRepositoryClassName;
137+
$app['orm.entity_listener_resolver'] = $entityListenerResolver;
138+
$app['orm.repository_factory'] = $repositoryFactory;
139+
$app['orm.custom.hydration_modes'] = array('mymode' => 'Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator');
128140

129141
$this->assertEquals('/path/to/proxies', $app['orm.em.config']->getProxyDir());
130142
$this->assertEquals('TestDoctrineOrmProxiesNamespace', $app['orm.em.config']->getProxyNamespace());
131143
$this->assertFalse($app['orm.em.config']->getAutoGenerateProxyClasses());
144+
$this->assertEquals($metadataFactoryName, $app['orm.em.config']->getClassMetadataFactoryName());
145+
$this->assertEquals($entityRepositoryClassName, $app['orm.em.config']->getDefaultRepositoryClassName());
146+
$this->assertEquals($entityListenerResolver, $app['orm.em.config']->getEntityListenerResolver());
147+
$this->assertEquals($repositoryFactory, $app['orm.em.config']->getRepositoryFactory());
148+
$this->assertEquals('Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator', $app['orm.em.config']->getCustomHydrationMode('mymode'));
132149
}
133150

134151
/**
@@ -309,4 +326,41 @@ public function testMappingAlias()
309326

310327
$this->assertEquals($namespace, $app['orm.em.config']->getEntityNameSpace($alias));
311328
}
329+
330+
public function testStrategy()
331+
{
332+
$app = $this->createMockDefaultApp();
333+
334+
$doctrineOrmServiceProvider = new DoctrineOrmServiceProvider;
335+
$doctrineOrmServiceProvider->register($app);
336+
337+
$namingStrategy = $this->getMock('Doctrine\ORM\Mapping\DefaultNamingStrategy');
338+
$quoteStrategy = $this->getMock('Doctrine\ORM\Mapping\DefaultQuoteStrategy');
339+
340+
$app['orm.strategy.naming'] = $namingStrategy;
341+
$app['orm.strategy.quote'] = $quoteStrategy;
342+
343+
$this->assertEquals($namingStrategy, $app['orm.em.config']->getNamingStrategy());
344+
$this->assertEquals($quoteStrategy, $app['orm.em.config']->getQuoteStrategy());
345+
}
346+
347+
public function testCustomFunctions()
348+
{
349+
$app = $this->createMockDefaultApp();
350+
351+
$doctrineOrmServiceProvider = new DoctrineOrmServiceProvider;
352+
$doctrineOrmServiceProvider->register($app);
353+
354+
$numericFunction = $this->getMock('Doctrine\ORM\Query\AST\Functions\FunctionNode', array(), array('mynum'));
355+
$stringFunction = $this->getMock('Doctrine\ORM\Query\AST\Functions\FunctionNode', array(), array('mynum'));
356+
$datetimeFunction = $this->getMock('Doctrine\ORM\Query\AST\Functions\FunctionNode', array(), array('mynum'));
357+
358+
$app['orm.custom.functions.string'] = array('mystring' => $numericFunction);
359+
$app['orm.custom.functions.numeric'] = array('mynumeric' => $stringFunction);
360+
$app['orm.custom.functions.datetime'] = array('mydatetime' => $datetimeFunction);
361+
362+
$this->assertEquals($numericFunction, $app['orm.em.config']->getCustomStringFunction('mystring'));
363+
$this->assertEquals($numericFunction, $app['orm.em.config']->getCustomNumericFunction('mynumeric'));
364+
$this->assertEquals($numericFunction, $app['orm.em.config']->getCustomDatetimeFunction('mydatetime'));
365+
}
312366
}

0 commit comments

Comments
 (0)