"La classe XXX n'est pas une entité valide ou une super classe mappée" après avoir déplacé la classe dans le système de fichiers


91

J'avais une classe d'entité dans Aib \ PlatformBundle \ Entity \ User.php

Je n'ai eu aucun problème à essayer de créer sa classe de formulaire via

doctrine php app / console: generate: form AibPlatformBundle: Utilisateur

Maintenant, j'ai changé l'espace de noms en Aib \ PlatformBundle \ Entity \ Identity \ User, mais lorsque j'essaie de générer le formulaire avec la tâche, j'ai dit avant cela dit:

"La classe Aib \ PlatformBundle \ Entity \ User n'est pas une entité valide ou une super classe mappée."

Voici le contenu du fichier:

<?php
namespace Aib\PlatformBundle\Entity\Identity;

use Doctrine\ORM\Mapping as ORM;

    /**
     * Aib\PlatformBundle\Entity\Identity\User
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Aib\PlatformBundle\Entity\Identity
    \UserRepository")
     */
    class User
    {
    ...

Une idée?

symfony2.0.4


Avez-vous des classes étendant User pour lesquelles vous avez oublié de mettre à jour les espaces de noms?
Problématique

3
Autant que je sache, il n'est pas possible de définir des sous-espaces de noms pour vos entités, car Symfony essaiera toujours de résoudre AibPlatformBundle: User en Aim \ PlatformBundle \ Entity \ User , quel que soit son espace de noms.
Alessandro Desantis

Réponses:


227

Eu ce problème - n'oubliez pas l'annotation * @ORM\Entitycomme ci-dessous:

/**
 * Powma\ServiceBundle\Entity\User
 *
 * @ORM\Entity
 * @ORM\Table(name="users")
 */

15

Eu ce problème hier et a trouvé ce fil. J'ai créé l'entité avec le mappage dans un nouveau bundle (par exemple MyFooBundle / Entity / User.php), fait toute la configuration selon les documents mais j'ai eu la même erreur d'en haut en essayant de charger l'application.

En fin de compte, j'ai réalisé que je ne chargeais pas MyFooBundle dans AppKernel:

new My\FooBundle\MyFooBundle()

Un excellent moyen de déboguer ceci est d'exécuter cette commande:

app/console doctrine:mapping:info

13

Vérifiez que votre fichier config.yml devrait contenir quelque chose comme ceci:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
        types:
            json: Sonata\Doctrine\Types\JsonType

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        # auto_mapping: true
        entity_managers:
            default:
                mappings:
                    FOSUserBundle: ~
                    # ApplicationSonataUserBundle: ~
                    YourUserBundle: ~
                    SonataUserBundle: ~

Ajoutez votre propre bundle à la liste des mappages.


À votre santé!! Ma configuration (de Sonata) avait juste des mappages: ~, ne spécifiant aucun bundle .. Les ajouter manuellement a corrigé mon problème :)
shousper

10

J'ai résolu ce problème en passant falsecomme deuxième paramètre à Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Il m'a fallu un certain temps pour fouiller dans Google et le code source.

Mon cas était en quelque sorte spécial car j'utilisais un mappage pointant vers un autre répertoire sans rapport avec l'installation de Symfony car je devais également utiliser du code hérité.

J'avais refactoré les entités héritées et elles ont cessé de fonctionner. Ils utilisaient à la @Annotationplace de @ORM\Annotation, donc après la refactorisation, il n'a tout simplement pas pu lire les métadonnées. En n'utilisant pas un simple lecteur d'annotations, tout semble aller bien.


8

Dans mon cas, le problème a été résolu en changeant le cache de mes serveurs d' eAccelerator en APC . Apparemment, eAccelerator supprime tous les commentaires des fichiers qui cassent vos annotations.


Opcache a un paramètre pour désactiver la suppression des commentaires opcache.save_comments=1, peut-être y en a-t-il un aussi pour eAccelerator / APC?
Oylex

8

J'ai résolu ce problème en définissant $useSimpleAnnotationReader=falselors de la création du fichier MetaDataConfiguration.


7

gros merci à Mark Fu et mogoman

Je savais que ça devait être quelque part dans le config.yml ... et pouvoir le tester contre le

app/console doctrine:mapping:info

vraiment aidé!

En fait, cette commande s'arrête simplement à une erreur ... pas de retour, mais quand tout va bien, vous devriez pouvoir voir toutes vos entités répertoriées.


3

J'ai résolu la même exception en supprimant un fichier orm.php généré automatiquement en conflit dans le dossier Resources / config / doctrine du bundle; selon la documentation: "Un bundle ne peut accepter qu'un seul format de définition de métadonnées. Par exemple, il n'est pas possible de mélanger des définitions de métadonnées YAML avec des définitions de classe d'entité PHP annotées."


Je vous remercie. Tu m'as sauvé beaucoup de temps. Vous avez cette erreur après avoir créé une entité au format php, puis l'avez supprimée et créé une nouvelle entité annotée avec le même nom.
iMx

1

Très grande possibilité que vous ayez PHP 5.3.16 (Symfony 2.x ne fonctionnera pas avec lui). Quoi qu'il en soit, vous devriez charger la page de vérification sur http://you.site.name/config.php Si vous aviez un projet non travaillé sur le serveur d'hébergement, les lignes suivantes doivent être supprimées dans "config.php":

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
    '127.0.0.1',
    '::1',
))) {
    header('HTTP/1.0 403 Forbidden');
    exit('This script is only accessible from localhost.');
}

Bonne chance!


0

Dans mon cas, j'étais trop zélé lors d'un refactor et j'avais supprimé un fichier doctrine yml!


0

Dans mon cas sur mon mac, j'utilisais src / MainBundle / Resource / Config / Doctrine, bien sûr, cela fonctionnait sur Mac mais cela ne fonctionnait pas sur le serveur de production Ubuntu. Une fois renommé Config en config et Doctrine en doctrine, les fichiers de mappage ont été trouvés et cela a commencé à fonctionner.


-1

Je me suis débarrassé du même message d'erreur que dans votre cas en utilisant app / console_dev au lieu de simplement app / console

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.