vendor/doctrine/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * This software consists of voluntary contributions made by many individuals
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * and is licensed under the LGPL. For more information, see
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * <http://www.doctrine-project.org>.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
namespace Doctrine\ORM\Mapping\Driver;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
use Doctrine\Common\Cache\ArrayCache,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    Doctrine\Common\Annotations\AnnotationReader,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    Doctrine\Common\Annotations\AnnotationRegistry,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    Doctrine\ORM\Mapping\ClassMetadataInfo,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    Doctrine\ORM\Mapping\MappingException;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 * The AnnotationDriver reads the mapping metadata from docblock annotations.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
 * @since 2.0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
 * @author Benjamin Eberlei <kontakt@beberlei.de>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
 * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
 * @author Jonathan H. Wage <jonwage@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
 * @author Roman Borschel <roman@code-factory.org>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
class AnnotationDriver implements Driver
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
     * The AnnotationReader.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * @var AnnotationReader
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    protected $_reader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
     * The paths where to look for mapping files.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
     * @var array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    protected $_paths = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * The file extension of mapping documents.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     * @var string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    protected $_fileExtension = '.php';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
     * @param array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    protected $_classNames;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     * docblock annotations.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
     * @param AnnotationReader $reader The AnnotationReader to use, duck-typed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
     * @param string|array $paths One or multiple paths where mapping classes can be found.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    public function __construct($reader, $paths = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        $this->_reader = $reader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        if ($paths) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            $this->addPaths((array) $paths);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
     * Append lookup paths to metadata driver.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
     * @param array $paths
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    public function addPaths(array $paths)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        $this->_paths = array_unique(array_merge($this->_paths, $paths));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
     * Retrieve the defined metadata lookup paths.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
     * @return array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    public function getPaths()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        return $this->_paths;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
     * Get the file extension used to look for mapping files under
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
     * @return void
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    public function getFileExtension()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        return $this->_fileExtension;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
     * Set the file extension used to look for mapping files under
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
     * @param string $fileExtension The file extension to set
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
     * @return void
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    public function setFileExtension($fileExtension)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        $this->_fileExtension = $fileExtension;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    public function loadMetadataForClass($className, ClassMetadataInfo $metadata)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        $class = $metadata->getReflectionClass();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        $classAnnotations = $this->_reader->getClassAnnotations($class);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        // Compatibility with Doctrine Common 3.x
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        if ($classAnnotations && is_int(key($classAnnotations))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
            foreach ($classAnnotations as $annot) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
                $classAnnotations[get_class($annot)] = $annot;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        // Evaluate Entity annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        if (isset($classAnnotations['Doctrine\ORM\Mapping\Entity'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
            $entityAnnot = $classAnnotations['Doctrine\ORM\Mapping\Entity'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
            $metadata->setCustomRepositoryClass($entityAnnot->repositoryClass);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
            if ($entityAnnot->readOnly) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
                $metadata->markReadOnly();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        } else if (isset($classAnnotations['Doctrine\ORM\Mapping\MappedSuperclass'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
            $metadata->isMappedSuperclass = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
            throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
        // Evaluate Table annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
        if (isset($classAnnotations['Doctrine\ORM\Mapping\Table'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
            $tableAnnot = $classAnnotations['Doctrine\ORM\Mapping\Table'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
            $primaryTable = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
                'name' => $tableAnnot->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
                'schema' => $tableAnnot->schema
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
            );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
            if ($tableAnnot->indexes !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
                foreach ($tableAnnot->indexes as $indexAnnot) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
                    $primaryTable['indexes'][$indexAnnot->name] = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
                        'columns' => $indexAnnot->columns
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
                    );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
            if ($tableAnnot->uniqueConstraints !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
                foreach ($tableAnnot->uniqueConstraints as $uniqueConstraint) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
                    $primaryTable['uniqueConstraints'][$uniqueConstraint->name] = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
                        'columns' => $uniqueConstraint->columns
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
                    );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
            $metadata->setPrimaryTable($primaryTable);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
        // Evaluate NamedQueries annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
        if (isset($classAnnotations['Doctrine\ORM\Mapping\NamedQueries'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
            $namedQueriesAnnot = $classAnnotations['Doctrine\ORM\Mapping\NamedQueries'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
            foreach ($namedQueriesAnnot->value as $namedQuery) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
                $metadata->addNamedQuery(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
                    'name'  => $namedQuery->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
                    'query' => $namedQuery->query
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
                ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
        // Evaluate InheritanceType annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
        if (isset($classAnnotations['Doctrine\ORM\Mapping\InheritanceType'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
            $inheritanceTypeAnnot = $classAnnotations['Doctrine\ORM\Mapping\InheritanceType'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
            $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceTypeAnnot->value));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
            if ($metadata->inheritanceType != \Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_NONE) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
                // Evaluate DiscriminatorColumn annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
                if (isset($classAnnotations['Doctrine\ORM\Mapping\DiscriminatorColumn'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
                    $discrColumnAnnot = $classAnnotations['Doctrine\ORM\Mapping\DiscriminatorColumn'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
                    $metadata->setDiscriminatorColumn(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
                        'name' => $discrColumnAnnot->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
                        'type' => $discrColumnAnnot->type,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
                        'length' => $discrColumnAnnot->length
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
                    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
                    $metadata->setDiscriminatorColumn(array('name' => 'dtype', 'type' => 'string', 'length' => 255));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
                // Evaluate DiscriminatorMap annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
                if (isset($classAnnotations['Doctrine\ORM\Mapping\DiscriminatorMap'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
                    $discrMapAnnot = $classAnnotations['Doctrine\ORM\Mapping\DiscriminatorMap'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
                    $metadata->setDiscriminatorMap($discrMapAnnot->value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
        // Evaluate DoctrineChangeTrackingPolicy annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        if (isset($classAnnotations['Doctrine\ORM\Mapping\ChangeTrackingPolicy'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
            $changeTrackingAnnot = $classAnnotations['Doctrine\ORM\Mapping\ChangeTrackingPolicy'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
            $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_' . $changeTrackingAnnot->value));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
        // Evaluate annotations on properties/fields
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        foreach ($class->getProperties() as $property) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
            if ($metadata->isMappedSuperclass && ! $property->isPrivate()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
                ||
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
                $metadata->isInheritedField($property->name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
                ||
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
                $metadata->isInheritedAssociation($property->name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
            $mapping = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
            $mapping['fieldName'] = $property->getName();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
            // Check for JoinColummn/JoinColumns annotations
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
            $joinColumns = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
            if ($joinColumnAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\JoinColumn')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
                $joinColumns[] = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
                    'name' => $joinColumnAnnot->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
                    'referencedColumnName' => $joinColumnAnnot->referencedColumnName,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
                    'unique' => $joinColumnAnnot->unique,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
                    'nullable' => $joinColumnAnnot->nullable,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
                    'onDelete' => $joinColumnAnnot->onDelete,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
                    'onUpdate' => $joinColumnAnnot->onUpdate,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
                    'columnDefinition' => $joinColumnAnnot->columnDefinition,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
                );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
            } else if ($joinColumnsAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\JoinColumns')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
                foreach ($joinColumnsAnnot->value as $joinColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
                    $joinColumns[] = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
                        'name' => $joinColumn->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
                        'referencedColumnName' => $joinColumn->referencedColumnName,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
                        'unique' => $joinColumn->unique,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
                        'nullable' => $joinColumn->nullable,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
                        'onDelete' => $joinColumn->onDelete,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
                        'onUpdate' => $joinColumn->onUpdate,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
                        'columnDefinition' => $joinColumn->columnDefinition,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
                    );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
            // Field can only be annotated with one of:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
            // @Column, @OneToOne, @OneToMany, @ManyToOne, @ManyToMany
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
            if ($columnAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Column')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
                if ($columnAnnot->type == null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
                    throw MappingException::propertyTypeIsRequired($className, $property->getName());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
                $mapping['type'] = $columnAnnot->type;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
                $mapping['length'] = $columnAnnot->length;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
                $mapping['precision'] = $columnAnnot->precision;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
                $mapping['scale'] = $columnAnnot->scale;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
                $mapping['nullable'] = $columnAnnot->nullable;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
                $mapping['unique'] = $columnAnnot->unique;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
                if ($columnAnnot->options) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
                    $mapping['options'] = $columnAnnot->options;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
                if (isset($columnAnnot->name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
                    $mapping['columnName'] = $columnAnnot->name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
                if (isset($columnAnnot->columnDefinition)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
                    $mapping['columnDefinition'] = $columnAnnot->columnDefinition;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
                if ($idAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
                    $mapping['id'] = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
                if ($generatedValueAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\GeneratedValue')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
                    $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' . $generatedValueAnnot->strategy));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
                if ($versionAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Version')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
                    $metadata->setVersionMapping($mapping);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
                $metadata->mapField($mapping);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
                // Check for SequenceGenerator/TableGenerator definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
                if ($seqGeneratorAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\SequenceGenerator')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
                    $metadata->setSequenceGeneratorDefinition(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
                        'sequenceName' => $seqGeneratorAnnot->sequenceName,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
                        'allocationSize' => $seqGeneratorAnnot->allocationSize,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
                        'initialValue' => $seqGeneratorAnnot->initialValue
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
                    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
                } else if ($tblGeneratorAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\TableGenerator')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
                    throw MappingException::tableIdGeneratorNotImplemented($className);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
            } else if ($oneToOneAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OneToOne')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
                if ($idAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
                    $mapping['id'] = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
                $mapping['targetEntity'] = $oneToOneAnnot->targetEntity;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
                $mapping['joinColumns'] = $joinColumns;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
                $mapping['mappedBy'] = $oneToOneAnnot->mappedBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
                $mapping['inversedBy'] = $oneToOneAnnot->inversedBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
                $mapping['cascade'] = $oneToOneAnnot->cascade;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
                $mapping['orphanRemoval'] = $oneToOneAnnot->orphanRemoval;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
                $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $oneToOneAnnot->fetch);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
                $metadata->mapOneToOne($mapping);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
            } else if ($oneToManyAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OneToMany')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
                $mapping['mappedBy'] = $oneToManyAnnot->mappedBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
                $mapping['targetEntity'] = $oneToManyAnnot->targetEntity;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
                $mapping['cascade'] = $oneToManyAnnot->cascade;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
                $mapping['indexBy'] = $oneToManyAnnot->indexBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
                $mapping['orphanRemoval'] = $oneToManyAnnot->orphanRemoval;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
                $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $oneToManyAnnot->fetch);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
                if ($orderByAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OrderBy')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
                    $mapping['orderBy'] = $orderByAnnot->value;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
                $metadata->mapOneToMany($mapping);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
            } else if ($manyToOneAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\ManyToOne')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
                if ($idAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\Id')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
                    $mapping['id'] = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
                $mapping['joinColumns'] = $joinColumns;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
                $mapping['cascade'] = $manyToOneAnnot->cascade;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
                $mapping['inversedBy'] = $manyToOneAnnot->inversedBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
                $mapping['targetEntity'] = $manyToOneAnnot->targetEntity;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
                $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $manyToOneAnnot->fetch);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
                $metadata->mapManyToOne($mapping);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
            } else if ($manyToManyAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\ManyToMany')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
                $joinTable = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
                if ($joinTableAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\JoinTable')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
                    $joinTable = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
                        'name' => $joinTableAnnot->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
                        'schema' => $joinTableAnnot->schema
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
                    );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
                    foreach ($joinTableAnnot->joinColumns as $joinColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
                        $joinTable['joinColumns'][] = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
                            'name' => $joinColumn->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
                            'referencedColumnName' => $joinColumn->referencedColumnName,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
                            'unique' => $joinColumn->unique,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
                            'nullable' => $joinColumn->nullable,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
                            'onDelete' => $joinColumn->onDelete,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
                            'onUpdate' => $joinColumn->onUpdate,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
                            'columnDefinition' => $joinColumn->columnDefinition,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
                        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
                    foreach ($joinTableAnnot->inverseJoinColumns as $joinColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
                        $joinTable['inverseJoinColumns'][] = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
                            'name' => $joinColumn->name,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
                            'referencedColumnName' => $joinColumn->referencedColumnName,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
                            'unique' => $joinColumn->unique,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
                            'nullable' => $joinColumn->nullable,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
                            'onDelete' => $joinColumn->onDelete,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
                            'onUpdate' => $joinColumn->onUpdate,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
                            'columnDefinition' => $joinColumn->columnDefinition,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
                        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
                $mapping['joinTable'] = $joinTable;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
                $mapping['targetEntity'] = $manyToManyAnnot->targetEntity;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
                $mapping['mappedBy'] = $manyToManyAnnot->mappedBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
                $mapping['inversedBy'] = $manyToManyAnnot->inversedBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
                $mapping['cascade'] = $manyToManyAnnot->cascade;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
                $mapping['indexBy'] = $manyToManyAnnot->indexBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
                $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $manyToManyAnnot->fetch);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
                if ($orderByAnnot = $this->_reader->getPropertyAnnotation($property, 'Doctrine\ORM\Mapping\OrderBy')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
                    $mapping['orderBy'] = $orderByAnnot->value;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
                $metadata->mapManyToMany($mapping);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
        // Evaluate @HasLifecycleCallbacks annotation
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
        if (isset($classAnnotations['Doctrine\ORM\Mapping\HasLifecycleCallbacks'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
            foreach ($class->getMethods() as $method) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
                // filter for the declaring class only, callbacks from parents will already be registered.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
                if ($method->isPublic() && $method->getDeclaringClass()->getName() == $class->name) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
                    $annotations = $this->_reader->getMethodAnnotations($method);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
                    // Compatibility with Doctrine Common 3.x
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
                    if ($annotations && is_int(key($annotations))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
                        foreach ($annotations as $annot) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
                            $annotations[get_class($annot)] = $annot;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
                        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
                    if (isset($annotations['Doctrine\ORM\Mapping\PrePersist'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::prePersist);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
                    if (isset($annotations['Doctrine\ORM\Mapping\PostPersist'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postPersist);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
                    if (isset($annotations['Doctrine\ORM\Mapping\PreUpdate'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::preUpdate);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
                    if (isset($annotations['Doctrine\ORM\Mapping\PostUpdate'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postUpdate);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
                    if (isset($annotations['Doctrine\ORM\Mapping\PreRemove'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::preRemove);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
                    if (isset($annotations['Doctrine\ORM\Mapping\PostRemove'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postRemove);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
                    if (isset($annotations['Doctrine\ORM\Mapping\PostLoad'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
                        $metadata->addLifecycleCallback($method->getName(), \Doctrine\ORM\Events::postLoad);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
     * Whether the class with the specified name is transient. Only non-transient
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
     * classes, that is entities and mapped superclasses, should have their metadata loaded.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
     * A class is non-transient if it is annotated with either @Entity or
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
     * @MappedSuperclass in the class doc block.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
     * @param string $className
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
     * @return boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
    public function isTransient($className)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
        $classAnnotations = $this->_reader->getClassAnnotations(new \ReflectionClass($className));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
        // Compatibility with Doctrine Common 3.x
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
        if ($classAnnotations && is_int(key($classAnnotations))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
            foreach ($classAnnotations as $annot) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
                if ($annot instanceof \Doctrine\ORM\Mapping\Entity) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
                    return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
                if ($annot instanceof \Doctrine\ORM\Mapping\MappedSuperclass) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
                    return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
            return true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
        return ! isset($classAnnotations['Doctrine\ORM\Mapping\Entity']) &&
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
               ! isset($classAnnotations['Doctrine\ORM\Mapping\MappedSuperclass']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
     * {@inheritDoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
    public function getAllClassNames()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
        if ($this->_classNames !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
            return $this->_classNames;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        if (!$this->_paths) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
            throw MappingException::pathRequired();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
        $classes = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
        $includedFiles = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
        foreach ($this->_paths as $path) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
            if ( ! is_dir($path)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
                throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
            $iterator = new \RegexIterator(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
                new \RecursiveIteratorIterator(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
                    new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
                    \RecursiveIteratorIterator::LEAVES_ONLY
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
                ),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
                '/^.+\\' . $this->_fileExtension . '$/i', 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
                \RecursiveRegexIterator::GET_MATCH
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
            );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
            
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
            foreach ($iterator as $file) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
                $sourceFile = realpath($file[0]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
                
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
                require_once $sourceFile;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
                
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
                $includedFiles[] = $sourceFile;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
        $declared = get_declared_classes();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
        foreach ($declared as $className) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
            $rc = new \ReflectionClass($className);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
            $sourceFile = $rc->getFileName();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
            if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
                $classes[] = $className;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
        $this->_classNames = $classes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
        return $classes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
     * Factory method for the Annotation Driver
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
     * @param array|string $paths
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
     * @param AnnotationReader $reader
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
     * @return AnnotationDriver
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
    static public function create($paths = array(), AnnotationReader $reader = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
        if ($reader == null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
            $reader = new AnnotationReader();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
            $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
        return new self($reader, $paths);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
}