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


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

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

Я отследил это использование

Используйте Doctrine\ORM\Отображение в качестве ORM; и @ORM\Таблица работает неправильно.

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

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

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

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

Cli-конфигурация,

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\Таблица, а другие похожие аннотации имели @ORM\часть, такую как @ORM\Столбец и т. Д.)

<?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()
    {

    }

}
Author: waney, 2012-03-18

10 answers

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

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

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

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

На самом деле я не смог найти метод setDefaultAnnotationNamespace в Класс чтения аннотаций. Так что это было странно. Но я предполагаю, что он устанавливает доктрину пространства имен\Orm\Сопоставление, так что аннотации в этом пространстве имен не нуждаются в префиксах. Отсюда и ошибка, так как кажется, что инструмент командной строки doctrine генерирует сущности по-разному. Я не уверен, почему это так.

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

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

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

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

Пример:

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)
));
 19
Author: Gohn67, 2012-03-27 03:12:49

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

$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)
 9
Author: Zorji, 2013-11-10 05:45:29

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

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

Бывший: если я использую "Доктрину\Общие\Аннотации\Simpleannotationreader" в качестве читателя, мне пришлось написать всю свою аннотацию без @ORM

Но если я использую "Доктрину\Общие\Аннотации\Читатель аннотаций", мне нужно добавить @ORM в аннотации, чтобы получить работу

 1
Author: Quaid, 2012-03-28 14:04:40

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

 0
Author: Hakan Deryal, 2012-03-21 17:24:08

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

 0
Author: Jon Skarpeteig, 2012-03-24 18:29:19

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

В вашей сущности, которую вы используете;

use Doctrine\Mapping as ORM;

Вместо:

use Doctrine\ORM\Mapping as ORM;

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

 0
Author: Lee Davis, 2012-03-28 09:40:59

Моя проблема заключалась в bootstrap.php (требуется по cli-config.php)

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

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

 0
Author: alvaro, 2013-04-20 09:58:50

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

Просмотрите 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 должен существовать.

[Испанский]

Ревизар эль архиво бутстрап у донде конфигурас эль орм доктрина, камбия лас анотасьон пор ямл:

/* Настройка с помощью аннотаций*/ //$config=Настройка::createannotationmetadataconfiguration(массив(КАТАЛОГ."/src"), $isdevmode);

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

Важно: el directorio/config/yml дебе существует.

 0
Author: Luillyfe, 2013-08-08 03:17:33
..

$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
Author: Max, 2014-01-10 19:01:13

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

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

 0
Author: SkaveRat, 2017-10-31 18:27:52