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()
{
}
}
Ответы
Ответ 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');
..