Доктрина 2 - Нет классов метаданных для обработки с помощью orm: generate-repositories - PullRequest
19 голосов
/ 18 марта 2012

Я пытаюсь сгенерировать репозитории объектов и получаю такое сообщение

Нет классов метаданных для обработки

Я бы отслеживал использование

использовать Doctrine \ ORM \ Mapping в качестве ORM;и @ORM \ Table не работает должным образом.

Если я изменю все @ORM \ Table на просто @Table (и другие аннотации) - он начнет работать, но я действительно не хочу получать его таким образом, как он должен работать с аннотацией @ORM.

Я безуспешно следовал инструкциям на странице ниже.Я знаю, что я близко, но что-то упустил с путями к файлам или пространствам имен.Пожалуйста помоги.

http://docs.doctrine -project.org / projects / doctrine-common / en / latest / reference / annotations.html

У кого-нибудь была такая проблема?Чего мне не хватает?

cli-config,

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;

require_once 'Doctrine/Common/ClassLoader.php';

define('APPLICATION_ENV', "development");
error_reporting(E_ALL);



//AnnotationRegistry::registerFile("Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php");
//AnnotationRegistry::registerAutoloadNamespace("Symfony\Component\Validator\Constraint", "Doctrine/Symfony");
//AnnotationRegistry::registerAutoloadNamespace("Annotations", "/Users/ivv/workspaceShipipal/shipipal/codebase/application/persistent/");

$classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
$classLoader->register();

$classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__ . '/application/');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__ . '/application/persistent');
$classLoader->register();

$config = new \Doctrine\ORM\Configuration();
$config->setProxyDir(__DIR__ . '/application/persistent/Proxies');
$config->setProxyNamespace('Proxies');

$config->setAutoGenerateProxyClasses((APPLICATION_ENV == "development"));


$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__ . "/application/persistent/Entities"));
$config->setMetadataDriverImpl($driverImpl);

if (APPLICATION_ENV == "development") {
    $cache = new \Doctrine\Common\Cache\ArrayCache();
} else {
    $cache = new \Doctrine\Common\Cache\ApcCache();
}

$config->setMetadataCacheImpl($cache);
$config->setQueryCacheImpl($cache);


$connectionOptions = array(
    'driver'   => 'pdo_mysql',
    'host'     => '127.0.0.1',
    'dbname'   => 'mydb',
    'user'     => 'root',
    'password' => ''

);

$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
$platform = $em->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
     'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
     'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));

User.php (рабочая версия, изначально это было так, как описано, @Table было @ORM \ Table и другие подобные аннотации имели @ORM\ part like @ORM \ Column и т. д.)

<?php
namespace Entities;


use Doctrine\Mapping as ORM;

/**
 * User
 *
 * @Table(name="user")
 * @Entity(repositoryClass="Repository\User")
 */
class User
{
    /**
     * @var integer $id
     *
     * @Column(name="id", type="integer", nullable=false)
     * @Id
     * @GeneratedValue
     */
    private $id;

    /**
     * @var string $userName
     *
     * @Column(name="userName", type="string", length=45, nullable=false)
     */
    private $userName;

    /**
     * @var string $email
     *
     * @Column(name="email", type="string", length=45, nullable=false)
     */
    private $email;

    /**
     * @var text $bio
     *
     * @Column(name="bio", type="text", nullable=true)
     */
    private $bio;

    public function __construct()
    {

    }

}

Ответы [ 10 ]

19 голосов
/ 22 марта 2012

РЕДАКТИРОВАТЬ 3:

Если это имеет значение, я использую Doctrine 2.2.1. В любом случае, я просто добавляю немного больше информации по этой теме.

Я покопался в классе Doctrine \ Configuration.php, чтобы посмотреть, как newDefaultAnnotationDriver создал AnnotationDriver. Метод начинается со строки 125, но соответствующая часть - это строки от 145 до 147, если вы используете последнюю версию общей библиотеки.

} else {
    $reader = new AnnotationReader();
    $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
}

Я не смог найти метод setDefaultAnnotationNamespace в классе AnnotationReader. Это было странно. Но я предполагаю, что он устанавливает пространство имен Doctrine \ Orm \ Mapping, так что аннотации в этом пространстве имен не должны иметь префикса. Отсюда и ошибка, так как кажется, что доктрина Cli Tool генерирует сущности по-разному. Я не уверен, почему это так.

В моем ответе ниже вы заметите, что я не вызывал метод setDefaultAnnotationNamespace.

С одной стороны, я заметил в вашем классе User Entity, что у вас есть use Doctrine\Mapping as ORM. Разве созданный файл не должен создавать use Doctrine\Orm\Mapping as ORM;? Или, может быть, это опечатка.

РЕДАКТ. 1: Хорошо, я нашел проблему. Очевидно, это связано с драйвером аннотации по умолчанию, который используется классом \ Doctrine \ ORM \ Configuration.

Таким образом, вместо использования $config->newDefaultAnnotationDriver(...) вам нужно создать экземпляр нового AnnotationReader, нового AnnotationDriver, а затем установить его в своем классе конфигурации.

Пример: * * тысяча двадцать-пять

AnnotationRegistry::registerFile("Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php");
$reader = new AnnotationReader();
$driverImpl = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($reader, array(__DIR__ . "/application/persistent/Entities"));
$config->setMetadataDriverImpl($driverImpl);

EDIT2 (Здесь настройки добавлены в ваш cli-config.php):

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;

require_once 'Doctrine/Common/ClassLoader.php';

define('APPLICATION_ENV', "development");
error_reporting(E_ALL);

$classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
$classLoader->register();

$classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__ . '/application/');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__ . '/application/persistent');
$classLoader->register();

$config = new \Doctrine\ORM\Configuration();
$config->setProxyDir(__DIR__ . '/application/persistent/Proxies');
$config->setProxyNamespace('Proxies');

$config->setAutoGenerateProxyClasses((APPLICATION_ENV == "development"));


 //Here is the part that needs to be adjusted to make allow the ORM namespace in the annotation be recognized

#$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__ . "/application/persistent/Entities"));

AnnotationRegistry::registerFile("Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php");
$reader = new AnnotationReader();
$driverImpl = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($reader, array(__DIR__ . "/application/persistent/Entities"));
$config->setMetadataDriverImpl($driverImpl);

//End of Changes

if (APPLICATION_ENV == "development") {
    $cache = new \Doctrine\Common\Cache\ArrayCache();
} else {
   $cache = new \Doctrine\Common\Cache\ApcCache();
}

$config->setMetadataCacheImpl($cache);
$config->setQueryCacheImpl($cache);


$connectionOptions = array(
    'driver'   => 'pdo_mysql',
    'host'     => '127.0.0.1',
    'dbname'   => 'mydb',
    'user'     => 'root',
    'password' => ''
);

$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
$platform = $em->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
10 голосов
/ 10 ноября 2013

Я только что столкнулся с той же проблемой, что и у тебя.Я использую Doctrine 2.4.Я могу решить эту проблему, выполнив это в файле конфигурации.Я не уверен, что это работает для версий <2.3. </p>

$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/entities"), $isDevMode, null, null, FALSE); // just add null, null, false at the end

Ниже приведена документация для метода createAnnotationMetadataConfiguration.Я только копаюсь в исходном коде.По умолчанию он использует простое средство чтения аннотаций, что означает, что вам не нужно иметь ORM \ перед вашей аннотацией, вы можете использовать @Entities вместо @ORM \ Entities.Поэтому все, что вам нужно сделать, это отключить его с помощью простого средства чтения аннотаций.

/**
 * Creates a configuration with an annotation metadata driver.
 *
 * @param array   $paths
 * @param boolean $isDevMode
 * @param string  $proxyDir
 * @param Cache   $cache
 * @param bool    $useSimpleAnnotationReader
 *
 * @return Configuration
 */
public static function createAnnotationMetadataConfiguration(array $paths, $isDevMode = false, $proxyDir = null, Cache $cache = null, $useSimpleAnnotationReader = true)
1 голос
/ 28 марта 2012

Как сказал Гун67 ... вам нужно создать нового читателя.

У меня была та же проблема, но с Zend.Проблема в читателе, а не в драйвере.

Пример: если я использую «Doctrine \ Common \ Annotations \ SimpleAnnotationReader» в качестве читателя, я должен был написать все свои аннотации без @ ORM

Но если я использую «Doctrine \ Common \ Annotations \ AnnotationReader», мне нужно добавить @ORM к аннотациям, чтобы получить работу

0 голосов
/ 10 января 2014
..

$generator = new EntityGenerator();
$generator->setAnnotationPrefix('');   // edit: quick fix for No Metadata Classes to process
$generator->setUpdateEntityIfExists(true); // only update if class already exists
//$generator->setRegenerateEntityIfExists(true);    // this will overwrite the existing classes
$generator->setGenerateStubMethods(true);

$generator->setAnnotationPrefix('ORM\\'); // <<---------------|

$generator->setGenerateAnnotations(true);
$generator->generate($metadata, __DIR__ . '/Entities');

..
0 голосов
/ 08 августа 2013

[английский]

Просмотрите файл bootstrap.php и, где вы настраиваете доктрину orm, вы меняете аннотации на yaml:

/* Configuring by annotacions*/
//$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);

/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);

Примечание: путь / config / yml должен существовать.

[Espanish]

Revisar el archivo, начальная доктрина и доктрина конфигурации, Камбия, las anotaciones por yaml:

/ * Настройка по аннотациям * / // $ config = Setup :: createAnnotationMetadataConfiguration (массив ( DIR . "/ src"), $ isDevMode);

/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);

Важное замечание: el Directorio / config / yml debe existir.

0 голосов
/ 20 апреля 2013

Моя проблема была в bootstrap.php (требуется cli-config.php)

$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);

этот "src" не указывал на правильную исходную папку.

0 голосов
/ 28 марта 2012

Заметил небольшое несоответствие ...

В вашей организации вы используете;

use Doctrine\Mapping as ORM;

Вместо:

use Doctrine\ORM\Mapping as ORM;

Может, это все исправит?

0 голосов
/ 24 марта 2012

Я столкнулся с аналогичной проблемой (хотя и наоборот) при обновлении с Doctrine 2.0 до Doctrine 2.1 (или 2.2). Для Doctrine 2.0 мои аннотации с использованием @Table работали нормально, но после обновления они начали жаловаться, что аннотация не была загружена. Я предлагаю вам попробовать Doctrine 2.2, чтобы использовать @ORM \ Table

0 голосов
/ 21 марта 2012

Наиболее вероятное объяснение состоит в том, что, как вы сказали, что-то не так с include (проблема пространства имен, проблема пути и т. Д.) Либо в читателе, либо в сущности.

0 голосов
/ 21 марта 2012

Я не могу найти ссылки на @ORM\Table нигде, кроме проектов Symfony2.В документации это всегда упоминается как @Table

Я знаю, что это работает в sf2 (я использую его там).Возможно ли, что это ошибка с установкой ванили из Doctrine?

...