diff -r b36a42d260d8 -r 624e5900f5a4 vendor/doctrine-fixtures/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/doctrine-fixtures/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php Wed Dec 14 23:28:58 2011 +0100 @@ -0,0 +1,186 @@ +. + */ + +namespace Doctrine\Common\DataFixtures; + +/** + * ReferenceRepository class manages references for + * fixtures in order to easily support the relations + * between fixtures + * + * @author Gediminas Morkevicius + */ +class ReferenceRepository +{ + /** + * List of named references to the fixture objects + * gathered during loads of fixtures + * + * @var array + */ + private $references = array(); + + /** + * List of identifiers stored for references + * in case if reference gets unmanaged, it will + * use a proxy referenced by this identity + * + * @var array + */ + private $identities = array(); + + /** + * Currently used object manager + * + * @var object - object manager + */ + private $manager; + + /** + * Initialize the ReferenceRepository + * + * @param object $manager + */ + public function __construct($manager) + { + $this->manager = $manager; + } + + /** + * Set the reference entry identified by $name + * and referenced to $reference. If $name + * already is set, it overrides it + * + * @param string $name + * @param object $reference + */ + public function setReference($name, $reference) + { + $this->references[$name] = $reference; + // in case if reference is set after flush, store its identity + $uow = $this->manager->getUnitOfWork(); + if ($uow->isInIdentityMap($reference)) { + if ($uow instanceof \Doctrine\ORM\UnitOfWork) { + $this->identities[$name] = $uow->getEntityIdentifier($reference); + } else { + $this->identities[$name] = $uow->getDocumentIdentifier($reference); + } + } + } + + /** + * Store the identifier of a reference + * + * @param string $name + * @param mixed $identity + */ + public function setReferenceIdentity($name, $identity) + { + $this->identities[$name] = $identity; + } + + /** + * Set the reference entry identified by $name + * and referenced to managed $object. $name must + * not be set yet + * + * Notice: in case if identifier is generated after + * the record is inserted, be sure tu use this method + * after $object is flushed + * + * @param string $name + * @param object $object - managed object + * @throws BadMethodCallException - if repository already has + * a reference by $name + * @return void + */ + public function addReference($name, $object) + { + if (isset($this->references[$name])) { + throw new \BadMethodCallException("Reference to: ({$name}) already exists, use method setReference in order to override it"); + } + $this->setReference($name, $object); + } + + /** + * Loads an object using stored reference + * named by $name + * + * @param string $name + * @return object + */ + public function getReference($name) + { + $reference = $this->references[$name]; + $meta = $this->manager->getClassMetadata(get_class($reference)); + $uow = $this->manager->getUnitOfWork(); + if (!$uow->isInIdentityMap($reference) && isset($this->identities[$name])) { + $reference = $this->manager->getReference( + $meta->name, + $this->identities[$name] + ); + $this->references[$name] = $reference; // allready in identity map + } + return $reference; + } + + /** + * Check if an object is stored using reference + * named by $name + * + * @param string $name + * @return boolean + */ + public function hasReference($name) + { + return isset($this->references[$name]); + } + + /** + * Searches for a reference name in the + * list of stored references + * + * @param object $reference + * @return string + */ + public function getReferenceName($reference) + { + return array_search($reference, $this->references, true); + } + + /** + * Checks if reference has identity stored + * + * @param string $name + */ + public function hasIdentity($name) + { + return array_key_exists($name, $this->identities); + } + + /** + * Get all stored references + * + * @return array + */ + public function getReferences() + { + return $this->references; + } +} \ No newline at end of file