[2.0] Placing loadClassMetadata() event so users can manipulate class meta data through events
This commit is contained in:
parent
6c1690d352
commit
c4e330e5ca
9 changed files with 115 additions and 8 deletions
|
@ -141,9 +141,7 @@ class EntityManager
|
|||
$this->_conn = $conn;
|
||||
$this->_config = $config;
|
||||
$this->_eventManager = $eventManager;
|
||||
$this->_metadataFactory = new ClassMetadataFactory(
|
||||
$this->_config->getMetadataDriverImpl(),
|
||||
$this->_conn->getDatabasePlatform());
|
||||
$this->_metadataFactory = new ClassMetadataFactory($this);
|
||||
$this->_metadataFactory->setCacheDriver($this->_config->getMetadataCacheImpl());
|
||||
$this->_unitOfWork = new UnitOfWork($this);
|
||||
$this->_proxyGenerator = new DynamicProxyGenerator($this, $this->_config->getCacheDir());
|
||||
|
|
27
lib/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php
Normal file
27
lib/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace Doctrine\ORM\Event;
|
||||
|
||||
use Doctrine\Common\EventArgs;
|
||||
|
||||
/**
|
||||
* Class that holds event arguments for a loadMetadata event.
|
||||
*
|
||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class LoadClassMetadataEventArgs extends EventArgs
|
||||
{
|
||||
private $_classMetadata;
|
||||
|
||||
public function __construct(\Doctrine\ORM\Mapping\ClassMetadata $classMetadata)
|
||||
{
|
||||
$this->_classMetadata = $classMetadata;
|
||||
}
|
||||
|
||||
public function getClassMetadata()
|
||||
{
|
||||
return $this->_classMetadata;
|
||||
}
|
||||
}
|
||||
|
|
@ -40,4 +40,5 @@ final class Events
|
|||
const preUpdate = 'preUpdate';
|
||||
const postUpdate = 'postUpdate';
|
||||
const load = 'load';
|
||||
const loadClassMetadata = 'loadClassMetadata';
|
||||
}
|
|
@ -23,6 +23,7 @@ namespace Doctrine\ORM\Mapping;
|
|||
|
||||
use Doctrine\Common\DoctrineException;
|
||||
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
||||
use Doctrine\ORM\Events;
|
||||
|
||||
/**
|
||||
* The metadata factory is used to create ClassMetadata objects that contain all the
|
||||
|
@ -38,10 +39,13 @@ use Doctrine\DBAL\Platforms\AbstractPlatform;
|
|||
*/
|
||||
class ClassMetadataFactory
|
||||
{
|
||||
private $_em;
|
||||
/** The targeted database platform. */
|
||||
private $_targetPlatform;
|
||||
/** The used metadata driver. */
|
||||
private $_driver;
|
||||
/** The event manager instance */
|
||||
private $_evm;
|
||||
/** The used cache driver. */
|
||||
private $_cacheDriver;
|
||||
private $_loadedMetadata = array();
|
||||
|
@ -51,10 +55,12 @@ class ClassMetadataFactory
|
|||
*
|
||||
* @param $driver The metadata driver to use.
|
||||
*/
|
||||
public function __construct($driver, AbstractPlatform $targetPlatform)
|
||||
public function __construct(\Doctrine\ORM\EntityManager $em)
|
||||
{
|
||||
$this->_driver = $driver;
|
||||
$this->_targetPlatform = $targetPlatform;
|
||||
$this->_em = $em;
|
||||
$this->_driver = $em->getConfiguration()->getMetadataDriverImpl();
|
||||
$this->_targetPlatform = $em->getConnection()->getDatabasePlatform();
|
||||
$this->_evm = $em->getEventManager();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -183,6 +189,11 @@ class ClassMetadataFactory
|
|||
|
||||
$class->setParentClasses($visited);
|
||||
|
||||
if ($this->_evm->hasListeners(Events::loadClassMetadata)) {
|
||||
$eventArgs = new \Doctrine\ORM\Event\LoadClassMetadataEventArgs($class);
|
||||
$this->_evm->dispatchEvent(Events::loadClassMetadata, $eventArgs);
|
||||
}
|
||||
|
||||
$this->_generateStaticSql($class);
|
||||
|
||||
$this->_loadedMetadata[$className] = $class;
|
||||
|
|
|
@ -13,4 +13,9 @@ class MetadataDriverMock
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function preload()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
}
|
|
@ -23,6 +23,7 @@ class AllTests
|
|||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\XmlDriverTest');
|
||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\YamlDriverTest');
|
||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataFactoryTest');
|
||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataLoadEventTest');
|
||||
|
||||
return $suite;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,11 @@ namespace Doctrine\Tests\ORM\Mapping;
|
|||
|
||||
use Doctrine\Tests\Mocks\MetadataDriverMock;
|
||||
use Doctrine\Tests\Mocks\DatabasePlatformMock;
|
||||
use Doctrine\Tests\Mocks\EntityManagerMock;
|
||||
use Doctrine\Tests\Mocks\ConnectionMock;
|
||||
use Doctrine\Tests\Mocks\DriverMock;
|
||||
use Doctrine\ORM\Mapping\ClassMetadata;
|
||||
use Doctrine\Common\EventManager;
|
||||
|
||||
require_once __DIR__ . '/../../TestInit.php';
|
||||
|
||||
|
@ -13,8 +17,16 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase
|
|||
|
||||
public function testGetMetadataForSingleClass()
|
||||
{
|
||||
$mockPlatform = new DatabasePlatformMock();
|
||||
$driverMock = new DriverMock();
|
||||
$config = new \Doctrine\ORM\Configuration();
|
||||
$eventManager = new EventManager();
|
||||
$conn = new ConnectionMock(array(), $driverMock, $config, $eventManager);
|
||||
$mockDriver = new MetadataDriverMock();
|
||||
$config->setMetadataDriverImpl($mockDriver);
|
||||
|
||||
$entityManager = EntityManagerMock::create($conn, $config, $eventManager);
|
||||
|
||||
$mockPlatform = $conn->getDatabasePlatform();
|
||||
$mockPlatform->setPrefersSequences(true);
|
||||
$mockPlatform->setPrefersIdentityColumns(false);
|
||||
|
||||
|
@ -30,7 +42,7 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase
|
|||
$cm1->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO);
|
||||
|
||||
// SUT
|
||||
$cmf = new ClassMetadataFactoryTestSubject($mockDriver, $mockPlatform);
|
||||
$cmf = new ClassMetadataFactoryTestSubject($entityManager);
|
||||
$cmf->setMetadataForClass('Doctrine\Tests\ORM\Mapping\TestEntity1', $cm1);
|
||||
|
||||
// Prechecks
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
namespace Doctrine\Tests\ORM\Mapping;
|
||||
|
||||
use Doctrine\ORM\Mapping\ClassMetadata;
|
||||
use Doctrine\ORM\Events;
|
||||
|
||||
require_once __DIR__ . '/../../TestInit.php';
|
||||
|
||||
class ClassMetadataLoadEventTest extends \Doctrine\Tests\OrmTestCase
|
||||
{
|
||||
public function testEvent()
|
||||
{
|
||||
$em = $this->_getTestEntityManager();
|
||||
$metadataFactory = $em->getMetadataFactory();
|
||||
$evm = $em->getEventManager();
|
||||
$evm->addEventListener(Events::loadClassMetadata, $this);
|
||||
$classMetadata = $metadataFactory->getMetadataFor('Doctrine\Tests\ORM\Mapping\LoadEventTestEntity');
|
||||
$this->assertTrue($classMetadata->hasField('about'));
|
||||
}
|
||||
|
||||
public function loadClassMetadata(\Doctrine\ORM\Event\LoadClassMetadataEventArgs $eventArgs)
|
||||
{
|
||||
$classMetadata = $eventArgs->getClassMetadata();
|
||||
$field = array(
|
||||
'fieldName' => 'about',
|
||||
'type' => 'string',
|
||||
'length' => 255
|
||||
);
|
||||
$classMetadata->mapField($field);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
* @Table(name="load_event_test_entity")
|
||||
*/
|
||||
class LoadEventTestEntity
|
||||
{
|
||||
/**
|
||||
* @Id @Column(type="integer")
|
||||
* @GeneratedValue(strategy="AUTO")
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @Column(type="string", length=255)
|
||||
*/
|
||||
private $name;
|
||||
|
||||
private $about;
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
namespace Doctrine\Tests\ORM\Mapping;
|
||||
|
||||
use Doctrine\ORM\Mapping\ClassMetadata;
|
||||
use Doctrine\ORM\Events;
|
||||
|
||||
require_once __DIR__ . '/../../TestInit.php';
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue