Доктрина 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()
{
}
}
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)
));
Я только что столкнулся с той же проблемой, что и у вас. Я использую доктрину 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)
Как сказал Ган67.. вам нужно создать экземпляр нового читателя.
У меня была та же проблема, но с Zend. Проблема в читателе, а не в водителе.
Бывший: если я использую "Доктрину\Общие\Аннотации\Simpleannotationreader" в качестве читателя, мне пришлось написать всю свою аннотацию без @ORM
Но если я использую "Доктрину\Общие\Аннотации\Читатель аннотаций", мне нужно добавить @ORM в аннотации, чтобы получить работу
Наиболее возможное объяснение, как вы сказали, заключается в том, что что-то не так с включением (проблема пространства имен, проблема пути и т.д.) Либо в reader, либо в сущности.
Я столкнулся с аналогичной проблемой (хотя и наоборот) при переходе с Доктрины 2.0 на Доктрину 2.1 (или 2.2). Для Доктрины 2.0 мои аннотации с использованием @Table работали нормально, но после обновления он начал жаловаться, что аннотации не загружены. Я предлагаю вам попробовать Доктрину 2.2, чтобы использовать @ORM\Table
Заметил небольшое несоответствие...
В вашей сущности, которую вы используете;
use Doctrine\Mapping as ORM;
Вместо:
use Doctrine\ORM\Mapping as ORM;
Может быть, это все исправит?
Моя проблема заключалась в bootstrap.php (требуется по cli-config.php)
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
Этот "src" не указывал на правильную исходную папку.
[Английский]
Просмотрите 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 дебе существует.
..
$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');
..
Я не могу найти никаких ссылок на @ORM\Table
нигде, кроме как в проектах Symfony2. В документации на него всегда ссылаются как @Table
Я знаю, что он работает в sf2 (я использую его там). Возможно ли, что это ошибка с ванильной установкой из доктрины?