web-dev-qa-db-fra.com

Doctrine 2 - Aucune classe de métadonnées à traiter par orm: generate-repositories

J'essaie de générer des référentiels d'entités et de recevoir un tel message 

Aucune classe de métadonnées à traiter

J'avais retrouvé cette utilisation de 

utilisez Doctrine\ORM\Mapping comme ORM; et @ ORM\Table ne fonctionne pas correctement. 

Si je modifie tout @ORM\Table en @Table (et autres annotations), cela commence à fonctionner, mais je ne veux vraiment pas que cela se passe ainsi car cela devrait fonctionner avec l'annotation @ORM. 

J'ai suivi les instructions de la page ci-dessous sans succès. Je sais que je suis proche, mais qu'il manque quelque chose avec des chemins de fichiers ou des espaces de noms. S'il vous plaît aider. 

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

Quelqu'un at-il eu un tel problème? Qu'est-ce que je manque?

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 (version de travail, initialement c'était comme décrit, @Table était @ORM\Table et d'autres annotations similaires avaient @ORM\part comme @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()
    {

    }

}
19
waney

EDIT 3:

Si c'est important, j'utilise Doctrine 2.2.1. Quoi qu'il en soit, j'ajoute juste un peu plus d'informations sur ce sujet.

J'ai creusé autour de la classe Doctrine\Configuration.php pour voir comment newDefaultAnnotationDriver avait créé AnnotationDriver. La méthode commence à la ligne 125, mais la partie pertinente est la ligne 145 à 147 si vous utilisez la dernière version de la bibliothèque commune.

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

Je n'ai pas trouvé la méthode setDefaultAnnotationNamespace dans la classe AnnotationReader. Donc c'était bizarre. Mais je suppose que cela définit l’espace de noms Doctrine\Orm\Mapping, de sorte que les annotations de cet espace de noms n’auront pas besoin d’être préfixées. D'où l'erreur puisqu'il semble que l'outil doctrine cli génère les entités différemment. Je ne sais pas pourquoi.

Vous remarquerez dans ma réponse ci-dessous que je n'ai pas appelé la méthode setDefaultAnnotationNamespace.

Une note de côté, j'ai remarqué dans votre classe d'entité utilisateur que vous avez use Doctrine\Mapping as ORM. Le fichier généré ne doit-il pas créer use Doctrine\Orm\Mapping as ORM;? Ou peut-être que c'est une faute de frappe.

EDIT 1: Ok, j'ai trouvé le problème. Apparemment, cela concerne le pilote d'annotation par défaut utilisé par la classe\Doctrine\ORM\Configuration. 

Ainsi, au lieu d'utiliser $config->newDefaultAnnotationDriver(...), vous devez instancier un nouveau AnnotationReader, un nouveau AnnotationDriver, puis le définir dans votre classe de configuration.

Exemple:

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 (ici les ajustements ajoutés à votre 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
Gohn67

Je viens de rencontrer le même problème que vous avez. J'utilise Doctrine 2.4. Je peux résoudre ce problème en le faisant dans le fichier de configuration. Je ne sais pas si cela fonctionne pour les versions <2.3.

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

Vous trouverez ci-dessous la documentation de la méthode createAnnotationMetadataConfiguration. Je viens de creuser dans le code source. Par défaut, il utilise un lecteur d'annotation simple, ce qui signifie que vous n'avez pas besoin d'avoir ORM\devant votre annotation, vous pouvez utiliser @Entities au lieu de @ORM\Entities. Donc, tout ce que vous avez à faire ici est de le désactiver en utilisant un simple lecteur d'annotation.

/**
 * 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
Zorji

Comme l'a dit Gohn67, il faut instancier un nouveau lecteur.

J'avais le même problème, mais avec Zend. Le problème réside dans le lecteur et non dans le pilote.

Ex: Si j'utilise "Doctrine\Common\Annotations\SimpleAnnotationReader" en tant que lecteur, je devais écrire toutes mes annotations sans @ORM.

Mais si j'utilise "Doctrine\Common\Annotations\AnnotationReader", je dois mettre @ORM sur les annotations pour obtenir du travail.

1
Quaid

Comme vous l'avez dit, l'explication la plus simple est que quelque chose qui ne va pas avec include (problème d'espace de nom, problème de chemin, etc.) soit dans le lecteur, soit dans l'entité.

0
Hakan Deryal

J'ai rencontré un problème similaire (bien que ce soit l'inverse) lors de la mise à niveau de Doctrine 2.0 à Doctrine 2.1 (ou 2.2). Pour Doctrine 2.0, mes annotations avec @Table fonctionnaient bien, mais après la mise à niveau, il a commencé à se plaindre que les annotations n'étaient pas chargées. Je vous suggère d'essayer Doctrine 2.2 afin d'utiliser @ORM\Table

0
Jon Skarpeteig

[Anglais]

Examinez le fichier bootstrap.php et, si vous configurez la doctrine orm, modifiez les annotations en utilisant yaml:

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

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

Remarque: le chemin/config/yml doit exister.

[Espagnol]

Commentaires sur l'archive de démarrage et de configuration de la doctrine, Cambodge et autres:

/ * Configuration par annotations */ // $ config = Setup :: createAnnotationMetadataConfiguration (array (DIR. "/ Src"), $ isDevMode);

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

Important: el directorio/config/yml debe existir.

0
Luillyfe

Je ne trouve aucune référence à @ORM\Table ailleurs que dans les projets Symfony2. Dans la documentation, il est toujours référencé par @Table

Je sais que cela fonctionne dans sf2 (je l'utilise là-bas). Est-il possible qu'il s'agisse d'un bogue avec une installation Vanilla de Doctrine?

0
SkaveRat

Mon problème était dans bootstrap.php (requis par cli-config.php)

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

ce "src" ne pointait pas vers le bon dossier source.

0
alvaro
..

$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
Max

Remarqué une petite différence ...

Dans votre entité, votre utilisation;

use Doctrine\Mapping as ORM;

Au lieu de:

use Doctrine\ORM\Mapping as ORM;

Peut-être que ça va le réparer?

0
Lee Davis