forked from doctrine/orm
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
29 changed files
with
1,196 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
{ | ||
"name": "doctrine/orm", | ||
"type": "library", | ||
"description": "Object-Relational-Mapper for PHP", | ||
"keywords": ["orm", "database"], | ||
"homepage": "http://www.doctrine-project.org", | ||
"license": "LGPL", | ||
"authors": [ | ||
{"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, | ||
{"name": "Roman Borschel", "email": "roman@code-factory.org"}, | ||
{"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, | ||
{"name": "Jonathan Wage", "email": "jonwage@gmail.com"} | ||
], | ||
"require": { | ||
"php": ">=5.3.2", | ||
"ext-pdo": "*", | ||
"doctrine/common": "master-dev", | ||
"doctrine/dbal": "master-dev" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
<?php | ||
/* | ||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
* | ||
* This software consists of voluntary contributions made by many individuals | ||
* and is licensed under the LGPL. For more information, see | ||
* <http://www.doctrine-project.org>. | ||
*/ | ||
|
||
namespace Doctrine\ORM\Event; | ||
|
||
use \Doctrine\Common\EventSubscriber; | ||
use \LogicException; | ||
|
||
/** | ||
* Delegate events only for certain entities they are registered for. | ||
* | ||
* @author Benjamin Eberlei <kontakt@beberlei.de> | ||
* @since 2.2 | ||
*/ | ||
class EntityEventDelegator implements EventSubscriber | ||
{ | ||
/** | ||
* Keeps track of all the event listeners. | ||
* | ||
* @var array | ||
*/ | ||
private $listeners = array(); | ||
|
||
/** | ||
* If frozen no new event listeners can be added. | ||
* | ||
* @var bool | ||
*/ | ||
private $frozen = false; | ||
|
||
/** | ||
* Adds an event listener that listens on the specified events. | ||
* | ||
* @param string|array $events The event(s) to listen on. | ||
* @param string|array $entities The entities to trigger this listener for | ||
* @param object $listener The listener object. | ||
*/ | ||
public function addEventListener($events, $entities, $listener) | ||
{ | ||
if ($this->frozen) { | ||
throw new LogicException("Cannot add event listeners after EntityEventDelegator::getSubscribedEvents() " . | ||
"is called once. This happens when you register the delegator with the event manager."); | ||
} | ||
|
||
// Picks the hash code related to that listener | ||
$hash = spl_object_hash($listener); | ||
|
||
foreach ((array) $events as $event) { | ||
// Overrides listener if a previous one was associated already | ||
// Prevents duplicate listeners on same event (same instance only) | ||
$this->listeners[$event][$hash] = array('listener' => $listener, 'entities' => array_flip((array)$entities)); | ||
} | ||
} | ||
|
||
/** | ||
* Adds an EventSubscriber. The subscriber is asked for all the events he is | ||
* interested in and added as a listener for these events. | ||
* | ||
* @param Doctrine\Common\EventSubscriber $subscriber The subscriber. | ||
*/ | ||
public function addEventSubscriber(EventSubscriber $subscriber, $entities) | ||
{ | ||
$this->addEventListener($subscriber->getSubscribedEvents(), $entities, $subscriber); | ||
} | ||
|
||
/** | ||
* Returns an array of events this subscriber wants to listen to. | ||
* | ||
* @return array | ||
*/ | ||
public function getSubscribedEvents() | ||
{ | ||
$this->frozen = true; | ||
return array_keys($this->listeners); | ||
} | ||
|
||
/** | ||
* Delegate the event to an appropriate listener | ||
* | ||
* @param $eventName | ||
* @param $event | ||
* @return void | ||
*/ | ||
public function __call($eventName, $args) | ||
{ | ||
$event = $args[0]; | ||
foreach ($this->listeners[$eventName] AS $listenerData) { | ||
$class = get_class($event->getEntity()); | ||
if (isset($listenerData['entities'][$class])) { | ||
$listenerData['listener']->$eventName($event); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
176 changes: 176 additions & 0 deletions
176
lib/Doctrine/ORM/Mapping/Driver/SimplifiedXmlDriver.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
<?php | ||
/* | ||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
* | ||
* This software consists of voluntary contributions made by many individuals | ||
* and is licensed under the LGPL. For more information, see | ||
* <http://www.doctrine-project.org>. | ||
*/ | ||
|
||
namespace Doctrine\ORM\Mapping\Driver; | ||
|
||
use Doctrine\ORM\Mapping\MappingException; | ||
|
||
/** | ||
* XmlDriver that additionally looks for mapping information in a global file. | ||
* | ||
* @author Fabien Potencier <fabien@symfony.com> | ||
* @author Benjamin Eberlei <kontakt@beberlei.de> | ||
* @license MIT | ||
*/ | ||
class SimplifiedXmlDriver extends XmlDriver | ||
{ | ||
protected $_prefixes = array(); | ||
protected $_globalBasename; | ||
protected $_classCache; | ||
protected $_fileExtension = '.orm.xml'; | ||
|
||
public function __construct($prefixes) | ||
{ | ||
$this->addNamespacePrefixes($prefixes); | ||
} | ||
|
||
public function setGlobalBasename($file) | ||
{ | ||
$this->_globalBasename = $file; | ||
} | ||
|
||
public function getGlobalBasename() | ||
{ | ||
return $this->_globalBasename; | ||
} | ||
|
||
public function addNamespacePrefixes($prefixes) | ||
{ | ||
$this->_prefixes = array_merge($this->_prefixes, $prefixes); | ||
$this->addPaths(array_flip($prefixes)); | ||
} | ||
|
||
public function getNamespacePrefixes() | ||
{ | ||
return $this->_prefixes; | ||
} | ||
|
||
public function isTransient($className) | ||
{ | ||
if (null === $this->_classCache) { | ||
$this->initialize(); | ||
} | ||
|
||
// The mapping is defined in the global mapping file | ||
if (isset($this->_classCache[$className])) { | ||
return false; | ||
} | ||
|
||
try { | ||
$this->_findMappingFile($className); | ||
|
||
return false; | ||
} catch (MappingException $e) { | ||
return true; | ||
} | ||
} | ||
|
||
public function getAllClassNames() | ||
{ | ||
if (null === $this->_classCache) { | ||
$this->initialize(); | ||
} | ||
|
||
$classes = array(); | ||
|
||
if ($this->_paths) { | ||
foreach ((array) $this->_paths as $path) { | ||
if (!is_dir($path)) { | ||
throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); | ||
} | ||
|
||
$iterator = new \RecursiveIteratorIterator( | ||
new \RecursiveDirectoryIterator($path), | ||
\RecursiveIteratorIterator::LEAVES_ONLY | ||
); | ||
|
||
foreach ($iterator as $file) { | ||
$fileName = $file->getBasename($this->_fileExtension); | ||
|
||
if ($fileName == $file->getBasename() || $fileName == $this->_globalBasename) { | ||
continue; | ||
} | ||
|
||
// NOTE: All files found here means classes are not transient! | ||
if (isset($this->_prefixes[$path])) { | ||
$classes[] = $this->_prefixes[$path].'\\'.str_replace('.', '\\', $fileName); | ||
} else { | ||
$classes[] = str_replace('.', '\\', $fileName); | ||
} | ||
} | ||
} | ||
} | ||
|
||
return array_merge($classes, array_keys($this->_classCache)); | ||
} | ||
|
||
public function getElement($className) | ||
{ | ||
if (null === $this->_classCache) { | ||
$this->initialize(); | ||
} | ||
|
||
if (!isset($this->_classCache[$className])) { | ||
$this->_classCache[$className] = parent::getElement($className); | ||
} | ||
|
||
return $this->_classCache[$className]; | ||
} | ||
|
||
protected function initialize() | ||
{ | ||
$this->_classCache = array(); | ||
if (null !== $this->_globalBasename) { | ||
foreach ($this->_paths as $path) { | ||
if (is_file($file = $path.'/'.$this->_globalBasename.$this->_fileExtension)) { | ||
$this->_classCache = array_merge($this->_classCache, $this->_loadMappingFile($file)); | ||
} | ||
} | ||
} | ||
} | ||
|
||
protected function _findMappingFile($className) | ||
{ | ||
$defaultFileName = str_replace('\\', '.', $className).$this->_fileExtension; | ||
foreach ($this->_paths as $path) { | ||
if (!isset($this->_prefixes[$path])) { | ||
if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { | ||
return $path.DIRECTORY_SEPARATOR.$defaultFileName; | ||
} | ||
|
||
continue; | ||
} | ||
|
||
$prefix = $this->_prefixes[$path]; | ||
|
||
if (0 !== strpos($className, $prefix.'\\')) { | ||
continue; | ||
} | ||
|
||
$filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->_fileExtension; | ||
if (is_file($filename)) { | ||
return $filename; | ||
} | ||
|
||
throw MappingException::mappingFileNotFound($className, $filename); | ||
} | ||
|
||
throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->_fileExtension); | ||
} | ||
} |
Oops, something went wrong.