2015-04-03 9 views
5

Ho un database molto semplice che sto cercando di importare e creare entità da. Doctrine (Symfony) è in grado di generare i file di mappatura YML dal database. Ma quando ho subsiquently tenta di generare entità, ottengo il seguente errore:Symfony2/Doctrine2 File di mapping non valido Eccezione durante il tentativo di generare entità

[Doctrine\Common\Persistence\Mapping\MappingException] 
Invalid mapping file 'SandboxBundle.Entity.Product.orm.yml' for class 
'SandboxBundle\Entity\Product'. 

Il file yml guarda bene a me, come ci si aspetterebbe di essere che è stato generato da Doctrine. Solo per essere sicuro, l'ho verificato con un validatore yml online che diceva che era OK. Il comando che ho utilizzato per tentare di generare le entità era:

app/console generate:doctrine:entities sandbox 

I file .yml seguono. Si prega di scusare eventuali errori di spaziatura yml che sono il risultato di incollare il file qui. Come ho detto, i file yml sono stati generati da doctrine e hanno superato una verifica online.

Product: 
    type: entity 
    table: product 
    indexes: 
     category_id: 
      columns: 
       - category_id 
    id: 
     id: 
      type: integer 
      nullable: false 
      unsigned: false 
      comment: '' 
      id: true 
      generator: 
       strategy: IDENTITY 
    fields: 
     productname: 
      type: string 
      nullable: true 
      length: 10 
      fixed: false 
      comment: '' 
     categoryId: 
      type: integer 
      nullable: true 
      unsigned: false 
      comment: '' 
      column: category_id 
lifecycleCallbacks: { } 

E per completezza, ecco il file yml di categoria. L'errore era sul prodotto, ma presumo che sia dovuto al fatto che il prodotto è stato elaborato per primo.

Category: 
    type: entity 
    table: category 
     id: 
      id: 
       type: integer 
       nullable: false 
       unsigned: false 
       comment: '' 
       id: true 
       generator: 
        strategy: IDENTITY 
     fields: 
      categoryname: 
       type: string 
       nullable: true 
       length: 50 
       fixed: false 
       comment: '' 
     lifecycleCallbacks: { } 

Ho cercato sul Web qualsiasi risorsa relativa alla diagnostica di Eccezioni di mapping, ma non ne ho trovato nessuna. Presumo che ci sia qualcosa nei file YML che sta causando il soffocamento del generatore di entità. Ma il messaggio di errore non fornisce indicazioni su cosa potrebbe essere. Vedo che ci sono molte istanze di questo tipo di domande su Stack Overflow. Sarebbe bello avere informazioni su COME per diagnosticare questi tipi di errori, e quindi essere in grado di capirlo da soli.

+0

Don, non è una soluzione, ma si fa avere un'opzione per eseguire il comando 'generate entità' con l'opzione 'verbose', che ti fornirà un dump di stack PHP, e quindi potrai iniziare a scavare nel codice Doctrine, per vedere almeno cosa sta fallendo. tuttavia, suggerisci che se hai intenzione di iniziare a frugare nel codice del fornitore, aggiungendo le istruzioni diagnostiche 'print_', e simili, che lo fai in un'istanza di prova di Symfony che crei appositamente per questo scopo. Questo è quello che ho fatto –

risposta

10

ha descritto nel doc:

class-names specified in the YAML files should be fully qualified.

in modo da provare modificare la definizione del prodotto yaml come segue:

SandboxBundle\Entity\Product: 
    type: entity 
    table: product 
    indexes: 
    ..... 

fare lo stesso in altri file di mapping.

Spero che questo aiuto

+0

No, anche quando ho aggiunto il nome completo, ho ancora lo stesso errore. Come ho detto, questi file YML sono stati generati da Doctrine. Ma grazie per lo sforzo. –

0

Usa

php app/console doctrine: generate: entità

per generare un'entità automaticamente dalla dottrina. Hai usato

app/console doctrine: generate: entità entityName

intendo

app/console generate: doctrine: entità entityName

(notare le "entità" plurale parola) il suo comando è generare la proprietà aggiornata di un'entità esistente e generare i suoi metodi getter e setter ma non generare un'entità.

Il mio suggerimento è:

  1. Eliminare l'entità esistente
  2. generare di nuovo utilizzando il comando appropriato.
2

Provare a rinominare il file

SandboxBundle.Entity.Product.orm.yml 

a

Product.orm.yml 

e assicurarsi di qualificare completamente il vostro nome nel yaml

SandboxBundle\Entity\Product: 
type: entity 
table: product 
indexes: 
..... 

si potrebbe ottenere un errore perché di doppio spazio dei nomi. Symfony aggiunge la parte tratteggiata del file allo spazio dei nomi.

[Doctrine\Common\Persistence\Mapping\MappingException] 
Invalid mapping file 'SandboxBundle.Entity.SandboxBundle.Entity.Product.orm.yml' for class 
'SandboxBundle\Entity\SandboxBundle\Entity\Product'. 

Buona fortuna :)

+0

proprio al momento giusto !!!! –

0

Recentemente stavo sperimentando simile "MappingException: file di mapping non valido" eccezioni utilizzando il seguente codice:

//bootstrap.php 
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__ . 
"/../config/dcm"), $isDevMode); 

Utilizzando Symfony Yaml 2. *, tutto ha funzionato bene . Ma con Symfony Yaml^3.3 otterrei l'eccezione del file di mapping non valido. Ho fatto riferimento a come funzionano le diverse funzioni di analisi delle librerie Yaml. Quando si utilizza Doctrine per analizzare i file YAML, userà la classe YamlDriver che carica file YAML utilizzando questa funzione:

// vendor/doctrine/orm/lib/Doctrine/Orm/Mapping/Driver/YamlDriver.php 
protected function loadMappingFile($file) 
{ 
    return Yaml::parse($file); 
} 

in YAML 2. *, passando una stringa nome di file da analizzare opere senza problemi, ma con Yaml^3.3 , la funzione parse prevede una stringa yaml. Alcuni modi per aggirare questo includono l'utilizzo di file di configurazione XML o scrivere il proprio driver Yaml e ottenere la configurazione bypassando Setup :: createYAMLMetadataConfiguration e utilizzando il seguente codice:

$config = self::createConfiguration($isDevMode, $proxyDir, $cache); 
$config->setMetadataDriverImpl(new \MyNamespace\YamlDriver($paths)); 

return $config;