Merge commit 'upstream/master'
Conflicts: lib/Doctrine/Common/Annotations/AnnotationReader.php lib/Doctrine/Common/Annotations/Parser.php
This commit is contained in:
commit
bff4f49b7a
@ -27,7 +27,8 @@ namespace Doctrine\Common\Annotations;
|
|||||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||||
* @link www.doctrine-project.org
|
* @link www.doctrine-project.org
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
* @version $Revision: 3938 $
|
* @version $Revision$
|
||||||
|
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
* @author Jonathan Wage <jonwage@gmail.com>
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
@ -52,14 +53,29 @@ class Annotation
|
|||||||
$this->$key = $value;
|
$this->$key = $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error handler for unknown property accessor in Annotation class.
|
||||||
|
*
|
||||||
|
* @param string $name Unknown property name
|
||||||
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
throw new \BadMethodCallException("Unknown annotation property '$name' on annotation '".get_class($this)."'.");
|
throw new \BadMethodCallException(
|
||||||
|
sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error handler for unknown property mutator in Annotation class.
|
||||||
|
*
|
||||||
|
* @param string $name Unkown property name
|
||||||
|
* @param mixed $value Property value
|
||||||
|
*/
|
||||||
public function __set($name, $value)
|
public function __set($name, $value)
|
||||||
{
|
{
|
||||||
throw new \BadMethodCallException("Unknown annotation property '$name' on annotation '".get_class($this)."'.");
|
throw new \BadMethodCallException(
|
||||||
|
sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -27,20 +27,32 @@ namespace Doctrine\Common\Annotations;
|
|||||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||||
* @link www.doctrine-project.org
|
* @link www.doctrine-project.org
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
* @version $Revision: 3938 $
|
* @version $Revision$
|
||||||
|
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
* @author Jonathan Wage <jonwage@gmail.com>
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
*/
|
*/
|
||||||
class AnnotationException extends \Doctrine\Common\CommonException
|
class AnnotationException extends \Exception
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Creates a new AnnotationException describing a Syntax error.
|
||||||
|
*
|
||||||
|
* @param string $message Exception message
|
||||||
|
* @return AnnotationException
|
||||||
|
*/
|
||||||
public static function syntaxError($message)
|
public static function syntaxError($message)
|
||||||
{
|
{
|
||||||
return new self('[Syntax Error] ' . $message);
|
return new self('[Syntax Error] ' . $message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
public static function semanticalError($message)
|
* Creates a new AnnotationException describing a Semantical error.
|
||||||
|
*
|
||||||
|
* @param string $message Exception message
|
||||||
|
* @return AnnotationException
|
||||||
|
*/
|
||||||
|
public static function semanticalError($message)
|
||||||
{
|
{
|
||||||
return new self('[Semantical Error] ' . $message);
|
return new self('[Semantical Error] ' . $message);
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ class AnnotationReader
|
|||||||
* @var string
|
* @var string
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
private static $CACHE_SALT = "@<Annot>";
|
private static $CACHE_SALT = '@<Annot>';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Annotations Parser
|
* Annotations Parser
|
||||||
@ -51,15 +51,14 @@ class AnnotationReader
|
|||||||
private $_parser;
|
private $_parser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cache machanism to store processed Annotations
|
* Cache mechanism to store processed Annotations
|
||||||
*
|
*
|
||||||
* @var Doctrine\Common\Cache\Cache
|
* @var Doctrine\Common\Cache\Cache
|
||||||
*/
|
*/
|
||||||
private $_cache;
|
private $_cache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor. Initializes a new AnnotationReader that uses the given
|
* Constructor. Initializes a new AnnotationReader that uses the given Cache provider.
|
||||||
* Cache provider.
|
|
||||||
*
|
*
|
||||||
* @param Cache $cache The cache provider to use. If none is provided, ArrayCache is used.
|
* @param Cache $cache The cache provider to use. If none is provided, ArrayCache is used.
|
||||||
*/
|
*/
|
||||||
@ -107,7 +106,7 @@ class AnnotationReader
|
|||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
$annotations = $this->_parser->parse($class->getDocComment(), "class ".$class->getName());
|
$annotations = $this->_parser->parse($class->getDocComment(), 'class ' . $class->getName());
|
||||||
$this->_cache->save($cacheKey, $annotations, null);
|
$this->_cache->save($cacheKey, $annotations, null);
|
||||||
|
|
||||||
return $annotations;
|
return $annotations;
|
||||||
@ -123,6 +122,7 @@ class AnnotationReader
|
|||||||
public function getClassAnnotation(ReflectionClass $class, $annotation)
|
public function getClassAnnotation(ReflectionClass $class, $annotation)
|
||||||
{
|
{
|
||||||
$annotations = $this->getClassAnnotations($class);
|
$annotations = $this->getClassAnnotations($class);
|
||||||
|
|
||||||
return isset($annotations[$annotation]) ? $annotations[$annotation] : null;
|
return isset($annotations[$annotation]) ? $annotations[$annotation] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ class AnnotationReader
|
|||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
$context = "property ".$property->getDeclaringClass()->getName()."::\$".$property->getName();
|
$context = 'property ' . $property->getDeclaringClass()->getName() . "::\$" . $property->getName();
|
||||||
$annotations = $this->_parser->parse($property->getDocComment(), $context);
|
$annotations = $this->_parser->parse($property->getDocComment(), $context);
|
||||||
$this->_cache->save($cacheKey, $annotations, null);
|
$this->_cache->save($cacheKey, $annotations, null);
|
||||||
|
|
||||||
@ -160,6 +160,7 @@ class AnnotationReader
|
|||||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotation)
|
public function getPropertyAnnotation(ReflectionProperty $property, $annotation)
|
||||||
{
|
{
|
||||||
$annotations = $this->getPropertyAnnotations($property);
|
$annotations = $this->getPropertyAnnotations($property);
|
||||||
|
|
||||||
return isset($annotations[$annotation]) ? $annotations[$annotation] : null;
|
return isset($annotations[$annotation]) ? $annotations[$annotation] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,7 +181,7 @@ class AnnotationReader
|
|||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
$context = "method ".$method->getDeclaringClass()->getName()."::".$method->getName()."()";
|
$context = 'method ' . $method->getDeclaringClass()->getName() . '::' . $method->getName() . '()';
|
||||||
$annotations = $this->_parser->parse($method->getDocComment(), $context);
|
$annotations = $this->_parser->parse($method->getDocComment(), $context);
|
||||||
$this->_cache->save($cacheKey, $annotations, null);
|
$this->_cache->save($cacheKey, $annotations, null);
|
||||||
|
|
||||||
@ -197,6 +198,7 @@ class AnnotationReader
|
|||||||
public function getMethodAnnotation(ReflectionMethod $method, $annotation)
|
public function getMethodAnnotation(ReflectionMethod $method, $annotation)
|
||||||
{
|
{
|
||||||
$annotations = $this->getMethodAnnotations($method);
|
$annotations = $this->getMethodAnnotations($method);
|
||||||
|
|
||||||
return isset($annotations[$annotation]) ? $annotations[$annotation] : null;
|
return isset($annotations[$annotation]) ? $annotations[$annotation] : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -27,7 +27,8 @@ namespace Doctrine\Common\Annotations;
|
|||||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||||
* @link www.doctrine-project.org
|
* @link www.doctrine-project.org
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
* @version $Revision: 3938 $
|
* @version $Revision$
|
||||||
|
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
* @author Jonathan Wage <jonwage@gmail.com>
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
@ -80,7 +81,7 @@ class Lexer extends \Doctrine\Common\Lexer
|
|||||||
$newVal = $this->_getNumeric($value);
|
$newVal = $this->_getNumeric($value);
|
||||||
|
|
||||||
// Checking numeric value
|
// Checking numeric value
|
||||||
if ($newVal !== false){
|
if ($newVal !== false) {
|
||||||
$value = $newVal;
|
$value = $newVal;
|
||||||
|
|
||||||
return (strpos($value, '.') !== false || stripos($value, 'e') !== false)
|
return (strpos($value, '.') !== false || stripos($value, 'e') !== false)
|
||||||
@ -93,16 +94,34 @@ class Lexer extends \Doctrine\Common\Lexer
|
|||||||
return self::T_STRING;
|
return self::T_STRING;
|
||||||
} else {
|
} else {
|
||||||
switch (strtolower($value)) {
|
switch (strtolower($value)) {
|
||||||
case '@': return self::T_AT;
|
case '@':
|
||||||
case ',': return self::T_COMMA;
|
return self::T_AT;
|
||||||
case '(': return self::T_OPEN_PARENTHESIS;
|
|
||||||
case ')': return self::T_CLOSE_PARENTHESIS;
|
case ',':
|
||||||
case '{': return self::T_OPEN_CURLY_BRACES;
|
return self::T_COMMA;
|
||||||
|
|
||||||
|
case '(':
|
||||||
|
return self::T_OPEN_PARENTHESIS;
|
||||||
|
|
||||||
|
case ')':
|
||||||
|
return self::T_CLOSE_PARENTHESIS;
|
||||||
|
|
||||||
|
case '{':
|
||||||
|
return self::T_OPEN_CURLY_BRACES;
|
||||||
|
|
||||||
case '}': return self::T_CLOSE_CURLY_BRACES;
|
case '}': return self::T_CLOSE_CURLY_BRACES;
|
||||||
case '=': return self::T_EQUALS;
|
case '=':
|
||||||
case '\\': return self::T_NAMESPACE_SEPARATOR;
|
return self::T_EQUALS;
|
||||||
case 'true': return self::T_TRUE;
|
|
||||||
case 'false': return self::T_FALSE;
|
case '\\':
|
||||||
|
return self::T_NAMESPACE_SEPARATOR;
|
||||||
|
|
||||||
|
case 'true':
|
||||||
|
return self::T_TRUE;
|
||||||
|
|
||||||
|
case 'false':
|
||||||
|
return self::T_FALSE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (ctype_alpha($value[0]) || $value[0] === '_') {
|
if (ctype_alpha($value[0]) || $value[0] === '_') {
|
||||||
return self::T_IDENTIFIER;
|
return self::T_IDENTIFIER;
|
||||||
@ -126,6 +145,7 @@ class Lexer extends \Doctrine\Common\Lexer
|
|||||||
if ( ! is_scalar($value)) {
|
if ( ! is_scalar($value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checking for valid numeric numbers: 1.234, -1.234e-2
|
// Checking for valid numeric numbers: 1.234, -1.234e-2
|
||||||
if (is_numeric($value)) {
|
if (is_numeric($value)) {
|
||||||
return $value;
|
return $value;
|
||||||
|
@ -23,10 +23,10 @@ namespace Doctrine\Common\Annotations;
|
|||||||
* A simple parser for docblock annotations.
|
* A simple parser for docblock annotations.
|
||||||
*
|
*
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
|
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
* @author Jonathan Wage <jonwage@gmail.com>
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
|
||||||
*/
|
*/
|
||||||
class Parser
|
class Parser
|
||||||
{
|
{
|
||||||
@ -168,9 +168,10 @@ class Parser
|
|||||||
$message .= "'{$token['value']}' at position {$token['position']}";
|
$message .= "'{$token['value']}' at position {$token['position']}";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen($this->_context)) {
|
if (strlen($this->_context)) {
|
||||||
$message .= ' in '.$this->_context;
|
$message .= ' in ' . $this->_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
$message .= '.';
|
$message .= '.';
|
||||||
|
|
||||||
throw AnnotationException::syntaxError($message);
|
throw AnnotationException::syntaxError($message);
|
||||||
@ -406,6 +407,7 @@ class Parser
|
|||||||
|
|
||||||
foreach ($values as $value) {
|
foreach ($values as $value) {
|
||||||
list ($key, $val) = $value;
|
list ($key, $val) = $value;
|
||||||
|
|
||||||
if ($key !== null) {
|
if ($key !== null) {
|
||||||
$array[$key] = $val;
|
$array[$key] = $val;
|
||||||
} else {
|
} else {
|
||||||
|
@ -78,7 +78,7 @@ EOT
|
|||||||
if (preg_match('/^select/i', $sql)) {
|
if (preg_match('/^select/i', $sql)) {
|
||||||
$resultSet = $conn->fetchAll($sql);
|
$resultSet = $conn->fetchAll($sql);
|
||||||
} else {
|
} else {
|
||||||
$resultSet = $em->getConnection()->executeUpdate($sql);
|
$resultSet = $conn->executeUpdate($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
\Doctrine\Common\Util\Debug::dump($resultSet, (int) $depth);
|
\Doctrine\Common\Util\Debug::dump($resultSet, (int) $depth);
|
||||||
|
@ -440,7 +440,8 @@ class EntityManager
|
|||||||
*
|
*
|
||||||
* @param object $entity The entity to copy.
|
* @param object $entity The entity to copy.
|
||||||
* @return object The new entity.
|
* @return object The new entity.
|
||||||
* @todo Implementation or remove.
|
* @todo Implementation need. This is necessary since $e2 = clone $e1; throws an E_FATAL when access anything on $e:
|
||||||
|
* Fatal error: Maximum function nesting level of '100' reached, aborting!
|
||||||
*/
|
*/
|
||||||
public function copy($entity, $deep = false)
|
public function copy($entity, $deep = false)
|
||||||
{
|
{
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* 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\Common\Cache\ArrayCache,
|
|
||||||
Doctrine\Common\Annotations\AnnotationReader,
|
|
||||||
Doctrine\DBAL\Schema\AbstractSchemaManager,
|
|
||||||
Doctrine\ORM\Mapping\ClassMetadataInfo,
|
|
||||||
Doctrine\ORM\Mapping\MappingException,
|
|
||||||
Doctrine\Common\Util\Inflector,
|
|
||||||
Doctrine\ORM\Mapping\Driver\AbstractFileDriver;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The PhpDriver includes php files which just populate ClassMetadataInfo
|
|
||||||
* instances with plain php code
|
|
||||||
*
|
|
||||||
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
|
||||||
* @link www.doctrine-project.org
|
|
||||||
* @since 2.0
|
|
||||||
* @version $Revision$
|
|
||||||
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
|
||||||
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
|
||||||
* @author Jonathan H. Wage <jonwage@gmail.com>
|
|
||||||
* @author Roman Borschel <roman@code-factory.org>
|
|
||||||
* @todo Rename: PHPDriver
|
|
||||||
*/
|
|
||||||
class PhpDriver extends AbstractFileDriver
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected $_fileExtension = '.php';
|
|
||||||
protected $_metadata;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function loadMetadataForClass($className, ClassMetadataInfo $metadata)
|
|
||||||
{
|
|
||||||
$this->_metadata = $metadata;
|
|
||||||
$this->_loadMappingFile($this->_findMappingFile($className));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function _loadMappingFile($file)
|
|
||||||
{
|
|
||||||
$metadata = $this->_metadata;
|
|
||||||
include $file;
|
|
||||||
}
|
|
||||||
}
|
|
122
lib/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php
Normal file
122
lib/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* 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\ClassMetadataInfo,
|
||||||
|
Doctrine\ORM\Mapping\MappingException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The StaticPHPDriver calls a static loadMetadata() method on your entity
|
||||||
|
* classes where you can manually populate the ClassMetadata instance.
|
||||||
|
*
|
||||||
|
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
|
||||||
|
* @link www.doctrine-project.org
|
||||||
|
* @since 2.0
|
||||||
|
* @version $Revision$
|
||||||
|
* @author Benjamin Eberlei <kontakt@beberlei.de>
|
||||||
|
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Jonathan H. Wage <jonwage@gmail.com>
|
||||||
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
|
*/
|
||||||
|
class StaticPHPDriver implements Driver
|
||||||
|
{
|
||||||
|
private $_paths = array();
|
||||||
|
|
||||||
|
public function __construct($paths)
|
||||||
|
{
|
||||||
|
$this->addPaths((array) $paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addPaths(array $paths)
|
||||||
|
{
|
||||||
|
$this->_paths = array_unique(array_merge($this->_paths, $paths));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function loadMetadataForClass($className, ClassMetadataInfo $metadata)
|
||||||
|
{
|
||||||
|
call_user_func_array(array($className, 'loadMetadata'), array($metadata));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
* @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it?
|
||||||
|
*/
|
||||||
|
public function getAllClassNames()
|
||||||
|
{
|
||||||
|
if ($this->_classNames !== null) {
|
||||||
|
return $this->_classNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->_paths) {
|
||||||
|
throw MappingException::pathRequired();
|
||||||
|
}
|
||||||
|
|
||||||
|
$classes = array();
|
||||||
|
$includedFiles = array();
|
||||||
|
|
||||||
|
foreach ($this->_paths as $path) {
|
||||||
|
if ( ! is_dir($path)) {
|
||||||
|
throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
$iterator = new \RecursiveIteratorIterator(
|
||||||
|
new \RecursiveDirectoryIterator($path),
|
||||||
|
\RecursiveIteratorIterator::LEAVES_ONLY
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($iterator as $file) {
|
||||||
|
if (($fileName = $file->getBasename($this->_fileExtension)) == $file->getBasename()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sourceFile = realpath($file->getPathName());
|
||||||
|
require_once $sourceFile;
|
||||||
|
$includedFiles[] = $sourceFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$declared = get_declared_classes();
|
||||||
|
|
||||||
|
foreach ($declared as $className) {
|
||||||
|
$rc = new \ReflectionClass($className);
|
||||||
|
$sourceFile = $rc->getFileName();
|
||||||
|
if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) {
|
||||||
|
$classes[] = $className;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_classNames = $classes;
|
||||||
|
|
||||||
|
return $classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isTransient($className)
|
||||||
|
{
|
||||||
|
return method_exists($className, 'loadMetadata') ? false : true;
|
||||||
|
}
|
||||||
|
}
|
@ -203,12 +203,15 @@ class Parser
|
|||||||
// Process any deferred validations of some nodes in the AST.
|
// Process any deferred validations of some nodes in the AST.
|
||||||
// This also allows post-processing of the AST for modification purposes.
|
// This also allows post-processing of the AST for modification purposes.
|
||||||
$this->_processDeferredIdentificationVariables();
|
$this->_processDeferredIdentificationVariables();
|
||||||
|
|
||||||
if ($this->_deferredPartialObjectExpressions) {
|
if ($this->_deferredPartialObjectExpressions) {
|
||||||
$this->_processDeferredPartialObjectExpressions();
|
$this->_processDeferredPartialObjectExpressions();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->_deferredPathExpressions) {
|
if ($this->_deferredPathExpressions) {
|
||||||
$this->_processDeferredPathExpressions($AST);
|
$this->_processDeferredPathExpressions($AST);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->_deferredResultVariables) {
|
if ($this->_deferredResultVariables) {
|
||||||
$this->_processDeferredResultVariables();
|
$this->_processDeferredResultVariables();
|
||||||
}
|
}
|
||||||
@ -456,7 +459,7 @@ class Parser
|
|||||||
// Check if IdentificationVariable exists in queryComponents
|
// Check if IdentificationVariable exists in queryComponents
|
||||||
if ( ! isset($this->_queryComponents[$identVariable])) {
|
if ( ! isset($this->_queryComponents[$identVariable])) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"'$identVariable' is not defined.", $deferredItem['token']
|
"'$identVariable' is not defined.", $deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -465,14 +468,14 @@ class Parser
|
|||||||
// Check if queryComponent points to an AbstractSchemaName or a ResultVariable
|
// Check if queryComponent points to an AbstractSchemaName or a ResultVariable
|
||||||
if ( ! isset($qComp['metadata'])) {
|
if ( ! isset($qComp['metadata'])) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"'$identVariable' does not point to a Class.", $deferredItem['token']
|
"'$identVariable' does not point to a Class.", $deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate if identification variable nesting level is lower or equal than the current one
|
// Validate if identification variable nesting level is lower or equal than the current one
|
||||||
if ($qComp['nestingLevel'] > $deferredItem['nestingLevel']) {
|
if ($qComp['nestingLevel'] > $deferredItem['nestingLevel']) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"'$identVariable' is used outside the scope of its declaration.", $deferredItem['token']
|
"'$identVariable' is used outside the scope of its declaration.", $deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -486,15 +489,15 @@ class Parser
|
|||||||
foreach ($expr->partialFieldSet as $field) {
|
foreach ($expr->partialFieldSet as $field) {
|
||||||
if ( ! isset($class->fieldMappings[$field])) {
|
if ( ! isset($class->fieldMappings[$field])) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"There is no mapped field named '$field' on class " . $class->name . ".",
|
"There is no mapped field named '$field' on class " . $class->name . ".",
|
||||||
$deferredItem['token']
|
$deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (array_intersect($class->identifier, $expr->partialFieldSet) != $class->identifier) {
|
if (array_intersect($class->identifier, $expr->partialFieldSet) != $class->identifier) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"The partial field selection of class " . $class->name . " must contain the identifier.",
|
"The partial field selection of class " . $class->name . " must contain the identifier.",
|
||||||
$deferredItem['token']
|
$deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,7 +517,7 @@ class Parser
|
|||||||
// Check if ResultVariable exists in queryComponents
|
// Check if ResultVariable exists in queryComponents
|
||||||
if ( ! isset($this->_queryComponents[$resultVariable])) {
|
if ( ! isset($this->_queryComponents[$resultVariable])) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"'$resultVariable' is not defined.", $deferredItem['token']
|
"'$resultVariable' is not defined.", $deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,14 +526,14 @@ class Parser
|
|||||||
// Check if queryComponent points to an AbstractSchemaName or a ResultVariable
|
// Check if queryComponent points to an AbstractSchemaName or a ResultVariable
|
||||||
if ( ! isset($qComp['resultVariable'])) {
|
if ( ! isset($qComp['resultVariable'])) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"'$identVariable' does not point to a ResultVariable.", $deferredItem['token']
|
"'$identVariable' does not point to a ResultVariable.", $deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate if identification variable nesting level is lower or equal than the current one
|
// Validate if identification variable nesting level is lower or equal than the current one
|
||||||
if ($qComp['nestingLevel'] > $deferredItem['nestingLevel']) {
|
if ($qComp['nestingLevel'] > $deferredItem['nestingLevel']) {
|
||||||
$this->semanticalError(
|
$this->semanticalError(
|
||||||
"'$resultVariable' is used outside the scope of its declaration.", $deferredItem['token']
|
"'$resultVariable' is used outside the scope of its declaration.", $deferredItem['token']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -625,6 +628,7 @@ class Parser
|
|||||||
),
|
),
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
$AST->fromClause->identificationVariableDeclarations[0]->joinVariableDeclarations[] = $joinVariableDeclaration;
|
$AST->fromClause->identificationVariableDeclarations[0]->joinVariableDeclarations[] = $joinVariableDeclaration;
|
||||||
|
|
||||||
$this->_queryComponents[$aliasIdentificationVariable . '.' . $field] = $joinQueryComponent;
|
$this->_queryComponents[$aliasIdentificationVariable . '.' . $field] = $joinQueryComponent;
|
||||||
|
@ -473,8 +473,12 @@ class SqlWalker implements TreeWalker
|
|||||||
if (count($assoc->sourceToTargetKeyColumns) > 1) {
|
if (count($assoc->sourceToTargetKeyColumns) > 1) {
|
||||||
throw QueryException::associationPathCompositeKeyNotSupported();
|
throw QueryException::associationPathCompositeKeyNotSupported();
|
||||||
}
|
}
|
||||||
$sql .= $this->getSqlTableAlias($class->table['name'], $dqlAlias) . '.'
|
|
||||||
. reset($assoc->targetToSourceKeyColumns);
|
if ($this->_useSqlTableAliases) {
|
||||||
|
$sql .= $this->getSqlTableAlias($class->table['name'], $dqlAlias) . '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= reset($assoc->targetToSourceKeyColumns);
|
||||||
} else {
|
} else {
|
||||||
// 2- Inverse side: NOT (YET?) SUPPORTED
|
// 2- Inverse side: NOT (YET?) SUPPORTED
|
||||||
throw QueryException::associationPathInverseSideNotSupported();
|
throw QueryException::associationPathInverseSideNotSupported();
|
||||||
|
@ -113,7 +113,7 @@ EOT
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( count($metadatas)) {
|
if (count($metadatas)) {
|
||||||
// Create EntityGenerator
|
// Create EntityGenerator
|
||||||
$entityGenerator = new EntityGenerator();
|
$entityGenerator = new EntityGenerator();
|
||||||
|
|
||||||
|
@ -488,7 +488,7 @@ class Application
|
|||||||
{
|
{
|
||||||
// namespace
|
// namespace
|
||||||
$namespace = '';
|
$namespace = '';
|
||||||
if (false !== $pos = strpos($name, ':'))
|
if (false !== $pos = strrpos($name, ':'))
|
||||||
{
|
{
|
||||||
$namespace = $this->findNamespace(substr($name, 0, $pos));
|
$namespace = $this->findNamespace(substr($name, 0, $pos));
|
||||||
$name = substr($name, $pos + 1);
|
$name = substr($name, $pos + 1);
|
||||||
|
@ -276,7 +276,7 @@ class Command
|
|||||||
*/
|
*/
|
||||||
public function setName($name)
|
public function setName($name)
|
||||||
{
|
{
|
||||||
if (false !== $pos = strpos($name, ':'))
|
if (false !== $pos = strrpos($name, ':'))
|
||||||
{
|
{
|
||||||
$namespace = substr($name, 0, $pos);
|
$namespace = substr($name, 0, $pos);
|
||||||
$name = substr($name, $pos + 1);
|
$name = substr($name, $pos + 1);
|
||||||
@ -375,6 +375,28 @@ class Command
|
|||||||
return $this->help;
|
return $this->help;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the processed help for the command replacing the %command.name% and
|
||||||
|
* %command.full_name% patterns with the real values dynamically.
|
||||||
|
*
|
||||||
|
* @return string The processed help for the command
|
||||||
|
*/
|
||||||
|
public function getProcessedHelp()
|
||||||
|
{
|
||||||
|
$name = $this->namespace.':'.$this->name;
|
||||||
|
|
||||||
|
$placeholders = array(
|
||||||
|
'%command.name%',
|
||||||
|
'%command.full_name%'
|
||||||
|
);
|
||||||
|
$replacements = array(
|
||||||
|
$name,
|
||||||
|
$_SERVER['PHP_SELF'].' '.$name
|
||||||
|
);
|
||||||
|
|
||||||
|
return str_replace($placeholders, $replacements, $this->getHelp());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the aliases for the command.
|
* Sets the aliases for the command.
|
||||||
*
|
*
|
||||||
@ -457,7 +479,7 @@ class Command
|
|||||||
|
|
||||||
$messages[] = $this->definition->asText();
|
$messages[] = $this->definition->asText();
|
||||||
|
|
||||||
if ($help = $this->getHelp())
|
if ($help = $this->getProcessedHelp())
|
||||||
{
|
{
|
||||||
$messages[] = '<comment>Help:</comment>';
|
$messages[] = '<comment>Help:</comment>';
|
||||||
$messages[] = ' '.implode("\n ", explode("\n", $help))."\n";
|
$messages[] = ' '.implode("\n ", explode("\n", $help))."\n";
|
||||||
|
@ -70,7 +70,7 @@ class ArgvInput extends Input
|
|||||||
protected function parse()
|
protected function parse()
|
||||||
{
|
{
|
||||||
$this->parsed = $this->tokens;
|
$this->parsed = $this->tokens;
|
||||||
while ($token = array_shift($this->parsed))
|
while (null !== ($token = array_shift($this->parsed)))
|
||||||
{
|
{
|
||||||
if ('--' === substr($token, 0, 2))
|
if ('--' === substr($token, 0, 2))
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace Doctrine\Tests\ORM\Mapping;
|
namespace Doctrine\Tests\ORM\Mapping;
|
||||||
|
|
||||||
use Doctrine\ORM\Mapping\ClassMetadata,
|
use Doctrine\ORM\Mapping\ClassMetadata,
|
||||||
|
Doctrine\ORM\Mapping\ClassMetadataInfo,
|
||||||
Doctrine\ORM\Mapping\Driver\XmlDriver,
|
Doctrine\ORM\Mapping\Driver\XmlDriver,
|
||||||
Doctrine\ORM\Mapping\Driver\YamlDriver;
|
Doctrine\ORM\Mapping\Driver\YamlDriver;
|
||||||
|
|
||||||
@ -264,4 +265,109 @@ class User
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function loadMetadata(ClassMetadataInfo $metadata)
|
||||||
|
{
|
||||||
|
$metadata->setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_NONE);
|
||||||
|
$metadata->setPrimaryTable(array(
|
||||||
|
'name' => 'cms_users',
|
||||||
|
));
|
||||||
|
$metadata->setChangeTrackingPolicy(ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT);
|
||||||
|
$metadata->addLifecycleCallback('doStuffOnPrePersist', 'prePersist');
|
||||||
|
$metadata->addLifecycleCallback('doOtherStuffOnPrePersistToo', 'prePersist');
|
||||||
|
$metadata->addLifecycleCallback('doStuffOnPostPersist', 'postPersist');
|
||||||
|
$metadata->mapField(array(
|
||||||
|
'id' => true,
|
||||||
|
'fieldName' => 'id',
|
||||||
|
'type' => 'integer',
|
||||||
|
'columnName' => 'id',
|
||||||
|
));
|
||||||
|
$metadata->mapField(array(
|
||||||
|
'fieldName' => 'name',
|
||||||
|
'type' => 'string',
|
||||||
|
'length' => 50,
|
||||||
|
'unique' => true,
|
||||||
|
'nullable' => true,
|
||||||
|
'columnName' => 'name',
|
||||||
|
));
|
||||||
|
$metadata->mapField(array(
|
||||||
|
'fieldName' => 'email',
|
||||||
|
'type' => 'string',
|
||||||
|
'columnName' => 'user_email',
|
||||||
|
'columnDefinition' => 'CHAR(32) NOT NULL',
|
||||||
|
));
|
||||||
|
$metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO);
|
||||||
|
$metadata->mapOneToOne(array(
|
||||||
|
'fieldName' => 'address',
|
||||||
|
'targetEntity' => 'Doctrine\\Tests\\ORM\\Mapping\\Address',
|
||||||
|
'cascade' =>
|
||||||
|
array(
|
||||||
|
0 => 'remove',
|
||||||
|
),
|
||||||
|
'mappedBy' => NULL,
|
||||||
|
'inversedBy' => 'user',
|
||||||
|
'joinColumns' =>
|
||||||
|
array(
|
||||||
|
0 =>
|
||||||
|
array(
|
||||||
|
'name' => 'address_id',
|
||||||
|
'referencedColumnName' => 'id',
|
||||||
|
'onDelete' => 'CASCADE',
|
||||||
|
'onUpdate' => 'CASCADE'
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'orphanRemoval' => false,
|
||||||
|
));
|
||||||
|
$metadata->mapOneToMany(array(
|
||||||
|
'fieldName' => 'phonenumbers',
|
||||||
|
'targetEntity' => 'Doctrine\\Tests\\ORM\\Mapping\\Phonenumber',
|
||||||
|
'cascade' =>
|
||||||
|
array(
|
||||||
|
1 => 'persist',
|
||||||
|
),
|
||||||
|
'mappedBy' => 'user',
|
||||||
|
'orphanRemoval' => false,
|
||||||
|
'orderBy' =>
|
||||||
|
array(
|
||||||
|
'number' => 'ASC',
|
||||||
|
),
|
||||||
|
));
|
||||||
|
$metadata->mapManyToMany(array(
|
||||||
|
'fieldName' => 'groups',
|
||||||
|
'targetEntity' => 'Doctrine\\Tests\\ORM\\Mapping\\Group',
|
||||||
|
'cascade' =>
|
||||||
|
array(
|
||||||
|
0 => 'remove',
|
||||||
|
1 => 'persist',
|
||||||
|
2 => 'refresh',
|
||||||
|
3 => 'merge',
|
||||||
|
4 => 'detach',
|
||||||
|
),
|
||||||
|
'mappedBy' => NULL,
|
||||||
|
'joinTable' =>
|
||||||
|
array(
|
||||||
|
'name' => 'cms_users_groups',
|
||||||
|
'joinColumns' =>
|
||||||
|
array(
|
||||||
|
0 =>
|
||||||
|
array(
|
||||||
|
'name' => 'user_id',
|
||||||
|
'referencedColumnName' => 'id',
|
||||||
|
'unique' => false,
|
||||||
|
'nullable' => false,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'inverseJoinColumns' =>
|
||||||
|
array(
|
||||||
|
0 =>
|
||||||
|
array(
|
||||||
|
'name' => 'group_id',
|
||||||
|
'referencedColumnName' => 'id',
|
||||||
|
'columnDefinition' => 'INT NULL',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'orderBy' => NULL,
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
@ -23,7 +23,8 @@ class AllTests
|
|||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\XmlMappingDriverTest');
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\XmlMappingDriverTest');
|
||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\YamlMappingDriverTest');
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\YamlMappingDriverTest');
|
||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\AnnotationDriverTest');
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\AnnotationDriverTest');
|
||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\PhpMappingDriverTest');
|
//$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\PHPMappingDriverTest'); FILE MISSING!!!
|
||||||
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\StaticPHPMappingDriverTest');
|
||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataFactoryTest');
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataFactoryTest');
|
||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataLoadEventTest');
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataLoadEventTest');
|
||||||
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\BasicInheritanceMappingTest');
|
$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\BasicInheritanceMappingTest');
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Doctrine\Tests\ORM\Mapping;
|
|
||||||
|
|
||||||
use Doctrine\ORM\Mapping\ClassMetadata,
|
|
||||||
Doctrine\ORM\Mapping\Driver\PhpDriver,
|
|
||||||
Doctrine\ORM\Tools\Export\ClassMetadataExporter;
|
|
||||||
|
|
||||||
require_once __DIR__ . '/../../TestInit.php';
|
|
||||||
|
|
||||||
class PhpMappingDriverTest extends AbstractMappingDriverTest
|
|
||||||
{
|
|
||||||
protected function _loadDriver()
|
|
||||||
{
|
|
||||||
$path = __DIR__ . DIRECTORY_SEPARATOR . 'php';
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Convert YAML mapping information to PHP
|
|
||||||
// Uncomment this code if the YAML changes and you want to update the PHP code
|
|
||||||
// for the same mapping information
|
|
||||||
$cme = new ClassMetadataExporter();
|
|
||||||
$cme->addMappingSource(__DIR__ . DIRECTORY_SEPARATOR . 'yaml');
|
|
||||||
|
|
||||||
$exporter = $cme->getExporter('php', $path);
|
|
||||||
$exporter->setMetadatas($cme->getMetadatas());
|
|
||||||
$exporter->export();
|
|
||||||
*/
|
|
||||||
|
|
||||||
return new PhpDriver($path);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Tests\ORM\Mapping;
|
||||||
|
|
||||||
|
use Doctrine\ORM\Mapping\ClassMetadata,
|
||||||
|
Doctrine\ORM\Mapping\Driver\StaticPHPDriver,
|
||||||
|
Doctrine\ORM\Tools\Export\ClassMetadataExporter;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../TestInit.php';
|
||||||
|
|
||||||
|
class StaticPHPMappingDriverTest extends AbstractMappingDriverTest
|
||||||
|
{
|
||||||
|
protected function _loadDriver()
|
||||||
|
{
|
||||||
|
return new StaticPHPDriver(__DIR__ . DIRECTORY_SEPARATOR . 'php');
|
||||||
|
}
|
||||||
|
}
|
@ -159,4 +159,12 @@ class UpdateSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
|
|||||||
'UPDATE cms_users SET status = ? WHERE id BETWEEN ? AND ?'
|
'UPDATE cms_users SET status = ? WHERE id BETWEEN ? AND ?'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSingleValuedAssociationFieldInWhere()
|
||||||
|
{
|
||||||
|
$this->assertSqlGeneration(
|
||||||
|
"UPDATE Doctrine\Tests\Models\CMS\CmsPhonenumber p SET p.phonenumber = 1234 WHERE p.user = ?1",
|
||||||
|
"UPDATE cms_phonenumbers SET phonenumber = 1234 WHERE user_id = ?"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ $connectionOptions = array(
|
|||||||
|
|
||||||
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
|
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
|
||||||
|
|
||||||
$helperSet = new \Symfony\Components\Console\Helper\HelperSet(array(
|
$helpers = array(
|
||||||
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
|
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
|
||||||
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
|
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
|
||||||
));
|
);
|
@ -13,7 +13,10 @@ require __DIR__ . '/cli-config.php';
|
|||||||
|
|
||||||
$cli = new \Symfony\Components\Console\Application('Doctrine Command Line Interface', Doctrine\Common\Version::VERSION);
|
$cli = new \Symfony\Components\Console\Application('Doctrine Command Line Interface', Doctrine\Common\Version::VERSION);
|
||||||
$cli->setCatchExceptions(true);
|
$cli->setCatchExceptions(true);
|
||||||
$cli->setHelperSet($helperSet);
|
$helperSet = $cli->getHelperSet();
|
||||||
|
foreach ($helpers as $name => $helper) {
|
||||||
|
$helperSet->set($helper, $name);
|
||||||
|
}
|
||||||
$cli->addCommands(array(
|
$cli->addCommands(array(
|
||||||
// DBAL Commands
|
// DBAL Commands
|
||||||
new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
|
new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
|
||||||
|
Loading…
Reference in New Issue
Block a user