Commit 6e5b1bbe authored by Benjamin Eberlei's avatar Benjamin Eberlei

DDC-510 - Refactored Metadata Driver to be an required option, even for...

DDC-510 - Refactored Metadata Driver to be an required option, even for Annotations - allowing to use the specified paths in ORM Tooling Commands
parent b2fe3820
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
namespace Doctrine\ORM; namespace Doctrine\ORM;
use Doctrine\Common\Cache\Cache,
Doctrine\ORM\Mapping\Driver\Driver;
/** /**
* Configuration container for all configuration options of Doctrine. * Configuration container for all configuration options of Doctrine.
* It combines all configuration options from DBAL & ORM. * It combines all configuration options from DBAL & ORM.
...@@ -118,11 +121,11 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -118,11 +121,11 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Sets the cache driver implementation that is used for metadata caching. * Sets the cache driver implementation that is used for metadata caching.
* *
* @param object $driverImpl * @param Driver $driverImpl
* @todo Force parameter to be a Closure to ensure lazy evaluation * @todo Force parameter to be a Closure to ensure lazy evaluation
* (as soon as a metadata cache is in effect, the driver never needs to initialize). * (as soon as a metadata cache is in effect, the driver never needs to initialize).
*/ */
public function setMetadataDriverImpl($driverImpl) public function setMetadataDriverImpl(Driver $driverImpl)
{ {
$this->_attributes['metadataDriverImpl'] = $driverImpl; $this->_attributes['metadataDriverImpl'] = $driverImpl;
} }
...@@ -168,14 +171,13 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -168,14 +171,13 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Gets the cache driver implementation that is used for the mapping metadata. * Gets the cache driver implementation that is used for the mapping metadata.
* *
* @return object * @throws ORMException
* @return Mapping\Driver\Driver
*/ */
public function getMetadataDriverImpl() public function getMetadataDriverImpl()
{ {
if ($this->_attributes['metadataDriverImpl'] == null) { if ($this->_attributes['metadataDriverImpl'] == null) {
$reader = new \Doctrine\Common\Annotations\AnnotationReader(new \Doctrine\Common\Cache\ArrayCache); throw ORMException::missingMappingDriverImpl();
$reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
$this->_attributes['metadataDriverImpl'] = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($reader);
} }
return $this->_attributes['metadataDriverImpl']; return $this->_attributes['metadataDriverImpl'];
...@@ -184,7 +186,7 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -184,7 +186,7 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Gets the cache driver implementation that is used for query result caching. * Gets the cache driver implementation that is used for query result caching.
* *
* @return object * @return \Doctrine\Common\Cache\Cache
*/ */
public function getResultCacheImpl() public function getResultCacheImpl()
{ {
...@@ -194,9 +196,9 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -194,9 +196,9 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Sets the cache driver implementation that is used for query result caching. * Sets the cache driver implementation that is used for query result caching.
* *
* @param object $cacheImpl * @param \Doctrine\Common\Cache\Cache $cacheImpl
*/ */
public function setResultCacheImpl($cacheImpl) public function setResultCacheImpl(Cache $cacheImpl)
{ {
$this->_attributes['resultCacheImpl'] = $cacheImpl; $this->_attributes['resultCacheImpl'] = $cacheImpl;
} }
...@@ -204,7 +206,7 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -204,7 +206,7 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Gets the cache driver implementation that is used for the query cache (SQL cache). * Gets the cache driver implementation that is used for the query cache (SQL cache).
* *
* @return object * @return \Doctrine\Common\Cache\Cache
*/ */
public function getQueryCacheImpl() public function getQueryCacheImpl()
{ {
...@@ -214,9 +216,9 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -214,9 +216,9 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Sets the cache driver implementation that is used for the query cache (SQL cache). * Sets the cache driver implementation that is used for the query cache (SQL cache).
* *
* @param object $cacheImpl * @param \Doctrine\Common\Cache\Cache $cacheImpl
*/ */
public function setQueryCacheImpl($cacheImpl) public function setQueryCacheImpl(Cache $cacheImpl)
{ {
$this->_attributes['queryCacheImpl'] = $cacheImpl; $this->_attributes['queryCacheImpl'] = $cacheImpl;
} }
...@@ -224,7 +226,7 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -224,7 +226,7 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Gets the cache driver implementation that is used for metadata caching. * Gets the cache driver implementation that is used for metadata caching.
* *
* @return object * @return \Doctrine\Common\Cache\Cache
*/ */
public function getMetadataCacheImpl() public function getMetadataCacheImpl()
{ {
...@@ -234,9 +236,9 @@ class Configuration extends \Doctrine\DBAL\Configuration ...@@ -234,9 +236,9 @@ class Configuration extends \Doctrine\DBAL\Configuration
/** /**
* Sets the cache driver implementation that is used for metadata caching. * Sets the cache driver implementation that is used for metadata caching.
* *
* @param object $cacheImpl * @param \Doctrine\Common\Cache\Cache $cacheImpl
*/ */
public function setMetadataCacheImpl($cacheImpl) public function setMetadataCacheImpl(Cache $cacheImpl)
{ {
$this->_attributes['metadataCacheImpl'] = $cacheImpl; $this->_attributes['metadataCacheImpl'] = $cacheImpl;
} }
......
...@@ -593,9 +593,9 @@ class EntityManager ...@@ -593,9 +593,9 @@ class EntityManager
* @param EventManager $eventManager The EventManager instance to use. * @param EventManager $eventManager The EventManager instance to use.
* @return EntityManager The created EntityManager. * @return EntityManager The created EntityManager.
*/ */
public static function create($conn, Configuration $config = null, EventManager $eventManager = null) public static function create($conn, Configuration $config, EventManager $eventManager = null)
{ {
$config = $config ?: new Configuration(); $config->getMetadataDriverImpl(); // assert this is set
if (is_array($conn)) { if (is_array($conn)) {
$conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, ($eventManager ?: new EventManager())); $conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, ($eventManager ?: new EventManager()));
......
...@@ -428,40 +428,41 @@ class AnnotationDriver implements Driver ...@@ -428,40 +428,41 @@ class AnnotationDriver implements Driver
return $this->_classNames; return $this->_classNames;
} }
$classes = array(); if (count($this->_paths) == 0) {
throw MappingException::pathRequired();
}
if ($this->_paths) { $classes = array();
$includedFiles = array(); $includedFiles = array();
foreach ((array) $this->_paths as $path) { foreach ($this->_paths as $path) {
if ( ! is_dir($path)) { if ( ! is_dir($path)) {
throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath(); throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath();
} }
$iterator = new \RecursiveIteratorIterator( $iterator = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($path), new \RecursiveDirectoryIterator($path),
\RecursiveIteratorIterator::LEAVES_ONLY \RecursiveIteratorIterator::LEAVES_ONLY
); );
foreach ($iterator as $file) { foreach ($iterator as $file) {
if (($fileName = $file->getBasename($this->_fileExtension)) == $file->getBasename()) { if (($fileName = $file->getBasename($this->_fileExtension)) == $file->getBasename()) {
continue; continue;
}
$sourceFile = realpath($file->getPathName());
require_once $sourceFile;
$includedFiles[] = $sourceFile;
} }
$sourceFile = realpath($file->getPathName());
require_once $sourceFile;
$includedFiles[] = $sourceFile;
} }
}
$declared = get_declared_classes(); $declared = get_declared_classes();
foreach ($declared as $className) { foreach ($declared as $className) {
$rc = new \ReflectionClass($className); $rc = new \ReflectionClass($className);
$sourceFile = $rc->getFileName(); $sourceFile = $rc->getFileName();
if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) {
$classes[] = $className; $classes[] = $className;
}
} }
} }
...@@ -470,4 +471,19 @@ class AnnotationDriver implements Driver ...@@ -470,4 +471,19 @@ class AnnotationDriver implements Driver
return $classes; return $classes;
} }
/**
* Factory method for the Annotation Driver
*
* @param array|string $paths
* @param AnnotationReader $reader
* @return AnnotationDriver
*/
static public function create($paths = array(), AnnotationReader $reader = null)
{
if ($reader == null) {
$reader = new AnnotationReader();
$reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
}
return new self($reader, $paths);
}
} }
...@@ -28,6 +28,12 @@ namespace Doctrine\ORM\Mapping; ...@@ -28,6 +28,12 @@ namespace Doctrine\ORM\Mapping;
*/ */
class MappingException extends \Doctrine\ORM\ORMException class MappingException extends \Doctrine\ORM\ORMException
{ {
public static function pathRequired()
{
return new self("Specifying the paths to your entities is required ".
"in the AnnotationDriver to retrieve all class names.");
}
public static function identifierRequired($entityName) public static function identifierRequired($entityName)
{ {
return new self("No identifier/primary key specified for Entity '$entityName'." return new self("No identifier/primary key specified for Entity '$entityName'."
......
...@@ -10,6 +10,12 @@ namespace Doctrine\ORM; ...@@ -10,6 +10,12 @@ namespace Doctrine\ORM;
*/ */
class ORMException extends \Exception class ORMException extends \Exception
{ {
public static function missingMappingDriverImpl()
{
return new self("It's a requirement to specify a Metadata Driver and pass it ".
"to Doctrine\ORM\Configuration::setMetadataDriverImpl().");
}
public static function entityMissingAssignedId($entity) public static function entityMissingAssignedId($entity)
{ {
return new self("Entity of type " . get_class($entity) . " is missing an assigned ID."); return new self("Entity of type " . get_class($entity) . " is missing an assigned ID.");
......
...@@ -50,36 +50,7 @@ abstract class AbstractCommand extends Command ...@@ -50,36 +50,7 @@ abstract class AbstractCommand extends Command
/* @var $em \Doctrine\ORM\EntityManager */ /* @var $em \Doctrine\ORM\EntityManager */
$em = $emHelper->getEntityManager(); $em = $emHelper->getEntityManager();
$reader = new \Doctrine\ORM\Tools\ClassMetadataReader(); $metadatas = $em->getMetadataFactory()->getAllMetadata();
$reader->setEntityManager($em);
$metadataDriver = $em->getConfiguration()->getMetadataDriverImpl();
if ($metadataDriver instanceof AbstractFileDriver) {
$reader->addMappingSource($metadataDriver);
}
// Process source directories
if ($emHelper->hasAdditionalMappingPathInformation()) {
foreach ($emHelper->getMappingPaths() as $dirName) {
$dirName = realpath($dirName);
if ( ! file_exists($dirName)) {
throw new \InvalidArgumentException(
sprintf("Mapping directory '<info>%s</info>' does not exist.", $dirName)
);
} else if ( ! is_readable($dirName)) {
throw new \InvalidArgumentException(
sprintf("Mapping directory '<info>%s</info>' does not have read permissions.", $dirName)
);
}
$reader->addMappingSource($dirName);
}
}
// Retrieving ClassMetadatas, autoloading required since we need access to the Reflection stuff.
$metadatas = $reader->getMetadatas(true);
if ( ! empty($metadatas)) { if ( ! empty($metadatas)) {
// Create SchemaTool // Create SchemaTool
......
...@@ -44,20 +44,14 @@ class EntityManagerHelper extends Helper ...@@ -44,20 +44,14 @@ class EntityManagerHelper extends Helper
*/ */
protected $_em; protected $_em;
/**
* @var array
*/
protected $_mappingPaths = array();
/** /**
* Constructor * Constructor
* *
* @param Connection $connection Doctrine Database Connection * @param Connection $connection Doctrine Database Connection
*/ */
public function __construct(EntityManager $em, $mappingPaths = array()) public function __construct(EntityManager $em)
{ {
$this->_em = $em; $this->_em = $em;
$this->_mappingPaths = $mappingPaths;
} }
/** /**
...@@ -70,16 +64,6 @@ class EntityManagerHelper extends Helper ...@@ -70,16 +64,6 @@ class EntityManagerHelper extends Helper
return $this->_em; return $this->_em;
} }
public function hasAdditionalMappingPathInformation()
{
return count($this->_mappingPaths);
}
public function getMappingPaths()
{
return $this->_mappingPaths;
}
/** /**
* @see Helper * @see Helper
*/ */
......
...@@ -78,6 +78,7 @@ class EntityManagerMock extends \Doctrine\ORM\EntityManager ...@@ -78,6 +78,7 @@ class EntityManagerMock extends \Doctrine\ORM\EntityManager
$config = new \Doctrine\ORM\Configuration(); $config = new \Doctrine\ORM\Configuration();
$config->setProxyDir(__DIR__ . '/../Proxies'); $config->setProxyDir(__DIR__ . '/../Proxies');
$config->setProxyNamespace('Doctrine\Tests\Proxies'); $config->setProxyNamespace('Doctrine\Tests\Proxies');
$config->setMetadataDriverImpl(\Doctrine\ORM\Mapping\Driver\AnnotationDriver::create());
} }
if (is_null($eventManager)) { if (is_null($eventManager)) {
$eventManager = new \Doctrine\Common\EventManager(); $eventManager = new \Doctrine\Common\EventManager();
......
...@@ -83,7 +83,7 @@ class QueryCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -83,7 +83,7 @@ class QueryCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase
public function testQueryCache_NoHitSaveParserResult() public function testQueryCache_NoHitSaveParserResult()
{ {
$this->_em->getConfiguration()->setQueryCacheImpl(null); $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
$query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux'); $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
...@@ -103,7 +103,7 @@ class QueryCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -103,7 +103,7 @@ class QueryCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase
public function testQueryCache_HitDoesNotSaveParserResult() public function testQueryCache_HitDoesNotSaveParserResult()
{ {
$this->_em->getConfiguration()->setQueryCacheImpl(null); $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
$query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux'); $query = $this->_em->createQuery('select ux from Doctrine\Tests\Models\CMS\CmsUser ux');
......
...@@ -82,7 +82,7 @@ class ResultCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -82,7 +82,7 @@ class ResultCacheTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->assertTrue($cache->contains('testing_result_cache_id')); $this->assertTrue($cache->contains('testing_result_cache_id'));
$this->_em->getConfiguration()->setResultCacheImpl(null); $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
} }
public function testNativeQueryResultCaching() public function testNativeQueryResultCaching()
......
...@@ -221,7 +221,7 @@ abstract class OrmFunctionalTestCase extends OrmTestCase ...@@ -221,7 +221,7 @@ abstract class OrmFunctionalTestCase extends OrmTestCase
} }
if (is_null(self::$_queryCacheImpl)) { if (is_null(self::$_queryCacheImpl)) {
self::$_queryCacheImpl = new \Doctrine\Common\Cache\ArrayCache; self::$_queryCacheImpl = new \Doctrine\Common\Cache\ArrayCache;
} }
$this->_sqlLoggerStack = new \Doctrine\DBAL\Logging\DebugStack(); $this->_sqlLoggerStack = new \Doctrine\DBAL\Logging\DebugStack();
...@@ -234,6 +234,9 @@ abstract class OrmFunctionalTestCase extends OrmTestCase ...@@ -234,6 +234,9 @@ abstract class OrmFunctionalTestCase extends OrmTestCase
$config->setQueryCacheImpl(self::$_queryCacheImpl); $config->setQueryCacheImpl(self::$_queryCacheImpl);
$config->setProxyDir(__DIR__ . '/Proxies'); $config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Doctrine\Tests\Proxies'); $config->setProxyNamespace('Doctrine\Tests\Proxies');
$driverImpl = \Doctrine\ORM\Mapping\Driver\AnnotationDriver::create();
$config->setMetadataDriverImpl($driverImpl);
$conn = $this->sharedFixture['conn']; $conn = $this->sharedFixture['conn'];
$conn->getConfiguration()->setSQLLogger($this->_sqlLoggerStack); $conn->getConfiguration()->setSQLLogger($this->_sqlLoggerStack);
......
...@@ -30,6 +30,10 @@ abstract class OrmTestCase extends DoctrineTestCase ...@@ -30,6 +30,10 @@ abstract class OrmTestCase extends DoctrineTestCase
} else { } else {
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache); $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
} }
$driverImpl = \Doctrine\ORM\Mapping\Driver\AnnotationDriver::create();
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl(self::getSharedQueryCacheImpl()); $config->setQueryCacheImpl(self::getSharedQueryCacheImpl());
$config->setProxyDir(__DIR__ . '/Proxies'); $config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Doctrine\Tests\Proxies'); $config->setProxyNamespace('Doctrine\Tests\Proxies');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment