Подтвердить что ты не робот

Doctrine 2 - Нет классов метаданных для обработки по orm: generate-repositories

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

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

Я бы отследил, что использование

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

Если я изменяю все @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()
    {

    }

}
4b9b3361

Ответ 1

ИЗМЕНИТЬ 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-инструмент порождает сущности по-разному. Я не уверен, почему это так.

В моем ответе ниже вы заметите, что метод 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)
));

Ответ 2

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

$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)

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

Отмечено небольшое несоответствие...

В вашем Entity ваше использование;

use Doctrine\Mapping as ORM;

Вместо:

use Doctrine\ORM\Mapping as ORM;

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

Ответ 8

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

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

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

Ответ 9

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

Просмотрите файл 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 bootstrap y donde configuras el orm doctrine, cambia 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.

Ответ 10

..

$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');

..