2012-03-18 10 views
18

Sto cercando di generare repository di entità e ottenere tale messaggioDottrina 2 - Classi No metadati di processo con orm: generate-repository

No metadati classi per elaborare

avrei rintracciato che uso di

usare Doctrine \ ORM \ Mapping come ORM; e @ORM \ La tabella non funziona correttamente.

Se cambio tutto @ORM \ Table in solo @Table (e altre annotazioni), inizia a funzionare, ma davvero non voglio ottenerlo in questo modo poiché dovrebbe funzionare con l'annotazione @ORM.

ho seguito le istruzioni da pagina qui sotto senza fortuna. So di essere vicino ma mi manca qualcosa con percorsi di file o spazi dei nomi. Per favore aiuto.

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

C'è qualcuno che ha avuto tale problema? Cosa mi manca?

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 (versione funzionante, inizialmente era come descritto, @Table era @ORM \ Tavolo e altre annotazioni simile era @ORM \ parte come @ORM \ Colonna ecc)

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

    } 

} 
+0

Sto avendo lo stesso problema solo ora. Vi posto una risposta se riesco a trovare una soluzione. – Gohn67

+0

distacco il codice del soggetto e il lettore, e la struttura di directory potrebbe aiutare ottenere una risposta precisa. –

+0

aggiunto codice SourceC per CLI config e User.php – waney

risposta

19

EDIT 3:

Se è importante, sto usando Doctrine 2.2.1. Comunque, sto solo aggiungendo un po 'più di informazioni su questo argomento.

Ho esaminato la classe Doctrine \ Configuration.php per vedere come newDefaultAnnotationDriver ha creato AnnotationDriver. Il metodo inizia sulla riga 125, ma la parte relativa è la riga 145 a 147 se si sta utilizzando l'ultima versione della libreria Common.

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

non ho potuto effettivamente trovare il metodo setDefaultAnnotationNamespace in classe AnnotationReader. Quindi era strano Ma suppongo che imposti lo spazio dei nomi Doctrine \ Orm \ Mapping, in modo che le annotazioni in quel namespace non abbiano bisogno di essere prefissate. Da qui l'errore poiché sembra che lo strumento cli dottrina generi le entità in modo diverso. Non sono sicuro del perché sia ​​così.

Nella mia risposta di seguito, non ho chiamato il metodo setDefaultAnnotationNamespace.

Una nota a margine, ho notato nella classe Entità utente che hai use Doctrine\Mapping as ORM. Il file generato non dovrebbe creare use Doctrine\Orm\Mapping as ORM;?O forse è un errore di battitura.

MODIFICA 1: Ok, ho trovato il problema. Apparentemente ha a che fare con il driver di annotazione predefinito usato dalla classe \ Doctrine \ ORM \ Configuration.

Quindi, invece di utilizzare $config->newDefaultAnnotationDriver(...), è necessario creare un'istanza di un nuovo AnnotationReader, un nuovo AnnotationDriver e quindi impostarlo nella classe di configurazione.

Esempio:

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 (Qui le regolazioni aggiunto al tuo 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) 
)); 
+0

sei un risparmiatore di vita. Avevo usato un vecchio progetto symfony per generare i mapping di entità Direttamente dalle tabelle del database e appena copiato le classi di entità oltre a questo nuovo progetto Doctrine. il vostro risposta era perfetto. ho fatto una scoperta "@ORM \" e sostituire "@" sulle mie classi di entità e voilà. Ora io in realtà sono mostrare nella console metadati entità dottrina. – Codezilla

0

non riesco a trovare alcun riferimento a @ORM\Table ovunque, ma nei progetti Symfony2. Nella documentazione viene sempre indicato come @Table

So che funziona in sf2 (lo sto usando lì). È possibile che si tratti di un bug con un'installazione vanilla di Doctrine?

+0

Non so perché, ma lo spazio dei nomi è omesso nella – undefined

+1

Penso che la documentazione. documentazione non è aggiornata (che è frustrante). –

0

La spiegazione più possibile è, come lei ha affermato, c'è qualcosa di sbagliato con include (problema dello spazio dei nomi, problema di percorso, ecc) sia in lettore o nell'entità.

0

mi ha colpito un problema simile (anche se il contrario), durante l'aggiornamento da Doctrine 2.0 a Doctrine 2.1 (o 2.2). Per Doctrine 2.0 le mie annotazioni con @Table funzionavano bene, ma dopo l'aggiornamento ha iniziato a lamentare che l'annotazione non era stata caricata. Io suggerisco di dare Dottrina 2.2 un andare, al fine di utilizzare @ORM \ Tabella

0

notato una piccola discrepanza ...

Nella tua Entity vostro usando;

use Doctrine\Mapping as ORM; 

Invece di:

use Doctrine\ORM\Mapping as ORM; 

Forse che sarà risolvere il problema?

1

Come dice Gohn67 .. devi installare un nuovo lettore.

Ho avuto lo stesso problema ma con Zend. Il problema è nel lettore e non nel driver.

Es: se uso "Doctrine \ Common \ NOTE \ SimpleAnnotationReader" come lettore Ho dovuto scrivere tutta la mia annotazione senza la @ORM

Ma se io uso "Doctrine \ Common \ NOTE \ AnnotationReader" i bisogno di mettere @ORM sulle annotazioni per ottenere il lavoro

0

il mio problema è stato in bootstrap.php (richiesto dalla cli-config.php)

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

questo "src" non stava indicando la cartella di origine corretta .

0

[English]

Rivedere il bootstrap.php di file e dove si configura l'ORM Doctrine, si modificano le annotazioni da YAML:

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

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

Nota: il percorso/config/yml deve esistere.

[Espanish]

Rivedere il file di bootstrap in cui si configura l'ORM Doctrine, modificare le voci da YAML:

/* Configurazione da annotacions */ // $ config = Configurazione :: createAnnotationMetadataConfiguration (array (DIR "/ src".) $ isDevMode);

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

Importante: il/config/yml deve esistere.

8

Ho appena incontrato lo stesso problema che si 've ottenuto. Sto usando Doctrine 2.4. Posso risolvere questo problema facendo il file di configurazione este. Non sono sicuro se questo funziona per le versioni 2.3 <.

$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/entities"), $isDevMode, null, null, FALSE); // just add null, null, false at the end 

Di seguito si riporta la documentazione per il metodo createAnnotationMetadataConfiguration. Ho appena scavare nel codice sorgente. Per impostazione predefinita esso uso semplice lettore di annotazione, che non è necessario significa avere ORM \ di fronte al vostro annotazione, si può fare @Entities INVECE DELLA @ORM \ Enti. Quindi tutto quello che dovete fare è quello di disabilitare utilizzando un semplice lettore di annotazione.

/** 
* 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) 
+0

questo funziona, grazie –

+0

questo è il risparmiatore di vita reale – NDM

0
.. 

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

..