"La classe XXX non è un'entità valida o una super classe mappata" dopo aver spostato la classe nel filesystem


91

Avevo una classe di entità in Aib \ PlatformBundle \ Entity \ User.php

Non ho avuto problemi a creare la sua classe form tramite

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

Ora ho cambiato lo spazio dei nomi in Aib \ PlatformBundle \ Entity \ Identity \ User, ma quando provo a generare il modulo con l'attività che ho detto prima, dice:

"La classe Aib \ PlatformBundle \ Entity \ User non è un'entità valida o una super classe mappata."

Questo è il contenuto del file:

<?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
    {
    ...

Qualche idea?

symfony2.0.4


Hai classi che estendono User per le quali hai dimenticato di aggiornare gli spazi dei nomi?
Problematico

3
Per quanto ne so, non è possibile definire sottospazi dei nomi per le proprie entità, poiché Symfony proverà sempre a risolvere AibPlatformBundle: User in Aim \ PlatformBundle \ Entity \ User , indipendentemente dal suo spazio dei nomi.
Alessandro Desantis

Risposte:


227

Ha avuto questo problema - non dimenticare l'annotazione * @ORM\Entitycome di seguito:

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

15

Ho avuto questo problema ieri e ho trovato questo thread. Ho creato l'entità con la mappatura in un nuovo bundle (ad esempio MyFooBundle / Entity / User.php), ho eseguito tutta la configurazione secondo i documenti ma ho ricevuto lo stesso errore dall'alto quando ho provato a caricare l'app.

Alla fine ho capito che non stavo caricando MyFooBundle in AppKernel:

new My\FooBundle\MyFooBundle()

Un ottimo modo per eseguire il debug è eseguire questo comando:

app/console doctrine:mapping:info

13

Controlla il tuo file config.yml, dovrebbe contenere qualcosa del genere:

# 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: ~

Aggiungi il tuo bundle all'elenco dei mapping.


Saluti!! La mia configurazione (da Sonata) aveva solo mappature: ~, non specificando alcun bundle .. L'aggiunta manuale ha risolto il mio problema :)
shousper

10

Ho risolto questo problema passando falsecome secondo parametro a Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Mi ci è voluto un po 'per esplorare Google e il codice sorgente.

Il mio caso era un po 'speciale poiché stavo usando una mappatura che puntava a un'altra directory non correlata all'installazione di Symfony poiché dovevo anche usare il codice legacy.

Avevo modificato le entità legacy e hanno smesso di funzionare. Usavano @Annotationinvece di @ORM\Annotation, quindi dopo il refactoring semplicemente non riusciva a leggere i metadati. Non utilizzando un semplice lettore di annotazioni, tutto sembra essere a posto.


8

Nel mio caso il problema è stato risolto cambiando la cache dei miei server da eAccelerator ad APC . Apparentemente eAccelerator rimuove tutti i commenti dai file che interrompono le tue annotazioni.


Opcache ha un'impostazione per disabilitare lo stripping dei commenti opcache.save_comments=1, forse ce n'è uno anche per eAccelerator / APC?
Oylex

8

Ho risolto questo problema impostando $useSimpleAnnotationReader=falsedurante la creazione del file MetaDataConfiguration.


7

Grazie mille a Mark Fu e Mogoman

Sapevo che doveva essere da qualche parte nel file config.yml ... ed essere in grado di testarlo contro il file

app/console doctrine:mapping:info

davvero aiutato!

In effetti, questo comando si ferma semplicemente a un errore ... nessun feedback, ma quando tutto va bene dovresti essere in grado di vedere tutte le tue entità elencate.


3

Ho risolto la stessa eccezione eliminando un file orm.php in conflitto generato automaticamente nella cartella Resources / config / doctrine del bundle; secondo la documentazione: "Un bundle può accettare un solo formato di definizione di metadati. Ad esempio, non è possibile combinare definizioni di metadati YAML con definizioni di classi di entità PHP annotate."


Grazie. Mi hai risparmiato un sacco di tempo. Ho ricevuto questo errore dopo aver creato un'entità in formato php, quindi cancellato e creato una nuova entità annotata con lo stesso nome.
iMx

1

Probabilità molto alta che tu abbia PHP 5.3.16 (Symfony 2.x non funzionerà con esso). Ad ogni modo dovresti caricare la pagina di controllo su http://you.site.name/config.php Se il progetto non ha funzionato sul server di hosting, le righe successive devono essere rimosse in "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.');
}

In bocca al lupo!


0

Nel mio caso, ero troppo zelante durante un refactoring e avevo cancellato un file yml doctrine!


0

Nel mio caso sul mio Mac stavo usando src / MainBundle / Resource / Config / Doctrine, ovviamente funzionava su Mac ma non funzionava sul server Ubuntu di produzione. Una volta rinominato Config in config e Doctrine in doctrine, i file di mappatura sono stati trovati e ha iniziato a funzionare.


-1

Mi sono sbarazzato dello stesso messaggio di errore del tuo caso utilizzando app / console_dev invece di app / console

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.