diff --git a/docs/configuration.md b/docs/configuration.md index a0cccff5..a3f0a0d3 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -209,3 +209,26 @@ return array( ), ); ``` + +### How to Use Quote Strategy + +[Official documentation](http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words) + +Zend Configuration + +```php +return array( + 'service_manager' => array( + 'invokables' => array( + 'Doctrine\ORM\Mapping\AnsiQuoteStrategy' => 'Doctrine\ORM\Mapping\AnsiQuoteStrategy', + ), + ), + 'doctrine' => array( + 'configuration' => array( + 'orm_default' => array( + 'quote_strategy' => 'Doctrine\ORM\Mapping\AnsiQuoteStrategy' + ), + ), + ), +); +``` \ No newline at end of file diff --git a/src/DoctrineORMModule/Options/Configuration.php b/src/DoctrineORMModule/Options/Configuration.php index 3caa6124..b1618c24 100644 --- a/src/DoctrineORMModule/Options/Configuration.php +++ b/src/DoctrineORMModule/Options/Configuration.php @@ -4,6 +4,7 @@ use Doctrine\ORM\Mapping\EntityListenerResolver; use Doctrine\ORM\Mapping\NamingStrategy; +use Doctrine\ORM\Mapping\QuoteStrategy; use Doctrine\ORM\Repository\RepositoryFactory; use Zend\Stdlib\Exception\InvalidArgumentException; @@ -153,6 +154,13 @@ class Configuration extends DBALConfiguration */ protected $namingStrategy; + /** + * Quote strategy or name of the quote strategy service to be set in ORM + * configuration (if any) + * + * @var string|null|QuoteStrategy + */ + protected $quoteStrategy; /** * Default repository class @@ -533,6 +541,39 @@ public function getNamingStrategy() return $this->namingStrategy; } + /** + * @param string|null|QuoteStrategy $quoteStrategy + * @return self + * @throws InvalidArgumentException when the provided quote strategy does not fit the expected type + */ + public function setQuoteStrategy($quoteStrategy) + { + if (null === $quoteStrategy + || is_string($quoteStrategy) + || $quoteStrategy instanceof QuoteStrategy + ) { + $this->quoteStrategy = $quoteStrategy; + + return $this; + } + + throw new InvalidArgumentException( + sprintf( + 'quoteStrategy must be either a string, a Doctrine\ORM\Mapping\QuoteStrategy ' + . 'instance or null, %s given', + is_object($quoteStrategy) ? get_class($quoteStrategy) : gettype($quoteStrategy) + ) + ); + } + + /** + * @return string|null|QuoteStrategy + */ + public function getQuoteStrategy() + { + return $this->quoteStrategy; + } + /** * @param string|null|RepositoryFactory $repositoryFactory * @return self diff --git a/src/DoctrineORMModule/Service/ConfigurationFactory.php b/src/DoctrineORMModule/Service/ConfigurationFactory.php index c3b07776..dfbff702 100644 --- a/src/DoctrineORMModule/Service/ConfigurationFactory.php +++ b/src/DoctrineORMModule/Service/ConfigurationFactory.php @@ -82,6 +82,18 @@ public function createService(ServiceLocatorInterface $serviceLocator) } } + if ($quoteStrategy = $options->getQuoteStrategy()) { + if (is_string($quoteStrategy)) { + if (!$serviceLocator->has($quoteStrategy)) { + throw new InvalidArgumentException(sprintf('Quote strategy "%s" not found', $quoteStrategy)); + } + + $config->setQuoteStrategy($serviceLocator->get($quoteStrategy)); + } else { + $config->setQuoteStrategy($quoteStrategy); + } + } + if ($repositoryFactory = $options->getRepositoryFactory()) { if (is_string($repositoryFactory)) { if (!$serviceLocator->has($repositoryFactory)) { diff --git a/tests/DoctrineORMModuleTest/Options/ConfigurationOptionsTest.php b/tests/DoctrineORMModuleTest/Options/ConfigurationOptionsTest.php index 57162356..7a325bd3 100644 --- a/tests/DoctrineORMModuleTest/Options/ConfigurationOptionsTest.php +++ b/tests/DoctrineORMModuleTest/Options/ConfigurationOptionsTest.php @@ -42,6 +42,23 @@ public function testSetGetNamingStrategy() $options->setNamingStrategy(new \stdClass()); } + public function testSetGetQuoteStrategy() + { + $options = new Configuration(); + $options->setQuoteStrategy(null); + $this->assertNull($options->getQuoteStrategy()); + + $options->setQuoteStrategy('test'); + $this->assertSame('test', $options->getQuoteStrategy()); + + $quoteStrategy = $this->getMock('Doctrine\ORM\Mapping\QuoteStrategy'); + $options->setQuoteStrategy($quoteStrategy); + $this->assertSame($quoteStrategy, $options->getQuoteStrategy()); + + $this->setExpectedException('Zend\Stdlib\Exception\InvalidArgumentException'); + $options->setQuoteStrategy(new \stdClass()); + } + public function testSetRepositoryFactory() { $options = new Configuration(); diff --git a/tests/DoctrineORMModuleTest/Service/ConfigurationFactoryTest.php b/tests/DoctrineORMModuleTest/Service/ConfigurationFactoryTest.php index 2606cc3a..59e09a6a 100644 --- a/tests/DoctrineORMModuleTest/Service/ConfigurationFactoryTest.php +++ b/tests/DoctrineORMModuleTest/Service/ConfigurationFactoryTest.php @@ -116,6 +116,59 @@ public function testWillNotInstantiateConfigWithInvalidNamingStrategyReference() $this->factory->createService($this->serviceManager); } + public function testWillInstantiateConfigWithQuoteStrategyObject() + { + $quoteStrategy = $this->getMock('Doctrine\ORM\Mapping\QuoteStrategy'); + + $config = array( + 'doctrine' => array( + 'configuration' => array( + 'test_default' => array( + 'quote_strategy' => $quoteStrategy, + ), + ), + ), + ); + $this->serviceManager->setService('Config', $config); + $factory = new ConfigurationFactory('test_default'); + $ormConfig = $factory->createService($this->serviceManager); + $this->assertSame($quoteStrategy, $ormConfig->getQuoteStrategy()); + } + + public function testWillInstantiateConfigWithQuoteStrategyReference() + { + $quoteStrategy = $this->getMock('Doctrine\ORM\Mapping\QuoteStrategy'); + $config = array( + 'doctrine' => array( + 'configuration' => array( + 'test_default' => array( + 'quote_strategy' => 'test_quote_strategy', + ), + ), + ), + ); + $this->serviceManager->setService('Config', $config); + $this->serviceManager->setService('test_quote_strategy', $quoteStrategy); + $ormConfig = $this->factory->createService($this->serviceManager); + $this->assertSame($quoteStrategy, $ormConfig->getQuoteStrategy()); + } + + public function testWillNotInstantiateConfigWithInvalidQuoteStrategyReference() + { + $config = array( + 'doctrine' => array( + 'configuration' => array( + 'test_default' => array( + 'quote_strategy' => 'test_quote_strategy', + ), + ), + ), + ); + $this->serviceManager->setService('Config', $config); + $this->setExpectedException('Zend\ServiceManager\Exception\InvalidArgumentException'); + $this->factory->createService($this->serviceManager); + } + public function testWillInstantiateConfigWithHydrationCacheSetting() { $config = array(