framework - install doctrine php
Doctrine 2-No hay clases de metadatos para procesar por orm: generate-repositories (10)
Estoy tratando de generar repositorios de entidades y recibir tal mensaje
No hay clases de metadatos para procesar
He rastreado ese uso de
usa Doctrine / ORM / Mapping como ORM; y @ORM / Table no funciona correctamente.
Si cambio todas las @ORM / Table a solo @Table (y otras anotaciones), empieza a funcionar, pero realmente no quiero hacerlo de la misma manera, ya que debería funcionar con la anotación de @ORM.
Seguí las instrucciones de la página de abajo sin suerte. Sé que estoy cerca pero me falta algo con las rutas de archivo o los espacios de nombres. Por favor ayuda.
http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html
¿Alguien ha tenido tal problema? ¿Qué me falta?
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 (la versión de trabajo, inicialmente era como se describe, @Table era @ORM / Table y otras anotaciones similares tenían @ORM / part como @ORM / Column, etc.)
<?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()
{
}
}
Acabo de encontrarme con el mismo problema que tú tienes. Estoy usando Doctrine 2.4. Puedo solucionar este problema haciendo esto en el archivo de configuración. No estoy seguro de si esto funciona para las versiones <2.3.
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/entities"), $isDevMode, null, null, FALSE); // just add null, null, false at the end
A continuación se muestra la documentación para el método createAnnotationMetadataConfiguration. Acabo de profundizar en el código fuente. Por defecto, utiliza un simple lector de anotaciones, lo que significa que no necesita tener ORM / frente a su anotación, puede hacer @Entities en lugar de @ORM / Entities. Así que todo lo que necesita hacer aquí es deshabilitarlo con un simple lector de anotaciones.
/**
* 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)
Como dijo Gohn67 ... tienes que crear una instancia de un nuevo lector.
Tuve el mismo problema pero con Zend. El problema está en el lector y no en el controlador.
Por ejemplo, si uso "Doctrine / Common / Annotations / SimpleAnnotationReader" como lector, tuve que escribir todas mis anotaciones sin el @ORM
Pero si uso "Doctrine / Common / Annotations / AnnotationReader" necesito poner @ORM en las anotaciones para obtener trabajo
La explicación más posible es, como usted indicó, que hay algo malo en incluir (problema del espacio de nombres, problema de la ruta, etc.) en el lector o en la entidad.
Me encontré con un problema similar (aunque al revés), al actualizar de Doctrine 2.0 a Doctrine 2.1 (o 2.2). Para Doctrine 2.0, mis anotaciones usando @Table funcionaron bien, pero después de la actualización comenzó a quejarse de que la anotación no estaba cargada. Le sugiero que pruebe Doctrine 2.2 para usar @ORM / Table
Mi problema estaba en bootstrap.php (requerido por cli-config.php)
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
este "src" no estaba apuntando a la carpeta de origen correcta.
No puedo encontrar ninguna referencia a @ORM/Table
ningún lugar, excepto en los proyectos Symfony2. En la documentación siempre se hace referencia como @Table
Sé que funciona en sf2 (lo estoy usando allí). ¿Es posible que sea un error con una instalación de vainilla desde Doctrine?
Notó una pequeña discrepancia ...
En su entidad su uso;
use Doctrine/Mapping as ORM;
En lugar de:
use Doctrine/ORM/Mapping as ORM;
Tal vez eso lo arregle?
[Inglés]
Revise el archivo bootstrap.php y, cuando configure la doctrina de orm, cambie las anotaciones por yaml:
/* Configuring by annotacions*/
//$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);
Nota: la ruta / config / yml debe existir.
El español
Revisar el archivo bootstrap y donde configuras el orm doctrine, cambia las anotaciones por yaml:
/ * Configurando por anotaciones * / // $ config = Setup :: createAnnotationMetadataConfiguration (array ( DIR . "/ Src"), $ isDevMode);
/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);
Importante: el directorio / config / yml debe existir.
EDITAR 3:
Si importa, estoy usando Doctrine 2.2.1. De todos modos, solo estoy agregando un poco más de información sobre este tema.
Busqué en la clase Doctrine / Configuration.php para ver cómo newDefaultAnnotationDriver creó el AnnotationDriver. El método comienza en la línea 125, pero la parte relevante es la línea 145 a 147 si está utilizando la última versión de la biblioteca común.
} else {
$reader = new AnnotationReader();
$reader->setDefaultAnnotationNamespace(''Doctrine/ORM/Mapping//');
}
Realmente no pude encontrar el método setDefaultAnnotationNamespace en la clase AnnotationReader. Así que eso fue raro. Pero supongo que establece el espacio de nombres Doctrine / Orm / Mapping, de modo que las anotaciones en ese espacio de nombres no necesitan ser prefijadas. De ahí el error, ya que parece que la herramienta doctrina cli genera las entidades de manera diferente. No estoy seguro de por qué es eso.
Notarás que en mi respuesta a continuación, no llamé al método setDefaultAnnotationNamespace.
Una nota al margen, noté en tu clase de Entidad de Usuario que has use Doctrine/Mapping as ORM
. ¿No debería el archivo generado crear use Doctrine/Orm/Mapping as ORM;
? O tal vez eso es un error tipográfico.
EDITAR 1: Ok, he encontrado el problema. Al parecer, tiene que ver con el controlador de anotación predeterminado utilizado por la clase / Doctrine / ORM / Configuration.
Entonces, en lugar de usar $config->newDefaultAnnotationDriver(...)
, debe crear una instancia de AnnotationReader, un nuevo AnnotationDriver, y luego establecerlo en su clase de Configuración.
Ejemplo:
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 (Aquí los ajustes agregados a su 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)
));
..
$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'');
..