"La clase XXX no es una entidad válida o una superclase mapeada" después de mover la clase en el sistema de archivos


91

Tenía una clase de entidad en Aib \ PlatformBundle \ Entity \ User.php

No tuve problemas para intentar crear su clase de formulario a través de

Aplicación php / doctrina de la consola: generate: form AibPlatformBundle: User

Ahora he cambiado el espacio de nombres a Aib \ PlatformBundle \ Entity \ Identity \ User, pero cuando intento generar el formulario con la tarea que dije antes, dice:

"La clase Aib \ PlatformBundle \ Entity \ User no es una entidad válida o una superclase mapeada".

Este es el contenido del archivo:

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

¿Alguna idea?

symfony2.0.4


¿Tiene alguna clase que extienda Usuario para la que olvidó actualizar los espacios de nombres?
Problemático

3
Hasta donde yo sé, no es posible definir subnombres para sus entidades, ya que Symfony siempre intentará resolver AibPlatformBundle: User to Aim \ PlatformBundle \ Entity \ User , independientemente de su espacio de nombres.
Alessandro Desantis

Respuestas:


227

Tuve este problema, no olvide la anotación * @ORM\Entitycomo a continuación:

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

15

Tuve este problema ayer y encontré este hilo. Creé la entidad con la asignación en un nuevo paquete (por ejemplo, MyFooBundle / Entity / User.php), hice toda la configuración de acuerdo con los documentos pero obtuve el mismo error de arriba al intentar cargar la aplicación.

Al final me di cuenta de que no estaba cargando MyFooBundle en AppKernel:

new My\FooBundle\MyFooBundle()

Una excelente manera de depurar esto es ejecutar este comando:

app/console doctrine:mapping:info

13

Verifique su archivo config.yml, debería contener algo como esto:

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

Agregue su propio paquete a la lista de asignaciones.


¡¡Salud!! Mi configuración (de Sonata) solo tenía asignaciones: ~, sin especificar ningún paquete. Agregarlos manualmente solucionó mi problema :)
shousper

10

Resolví esto pasando falsecomo segundo parámetro a Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Me tomó un tiempo buscar en Google y el código fuente.

Mi caso fue algo especial ya que estaba usando una asignación que apuntaba a otro directorio no relacionado con la instalación de Symfony, ya que también tenía que usar código heredado.

Había refactorizado las entidades heredadas y dejaron de funcionar. Solían usar en @Annotationlugar de @ORM\Annotation, por lo que después de la refactorización simplemente no pudo leer los metadatos. Al no usar un simple lector de anotaciones, todo parece estar bien.


8

En mi caso, el problema se resolvió cambiando la caché de mi servidor de eAccelerator a APC . Aparentemente, eAccelerator elimina todos los comentarios de los archivos que rompen sus anotaciones.


Opcache tiene una configuración para deshabilitar la eliminación de comentarios opcache.save_comments=1, ¿tal vez también haya una para eAccelerator / APC?
Oylex

8

Resolví este problema estableciendo $useSimpleAnnotationReader=falseal crear el MetaDataConfiguration.


7

gran agradecimiento a Mark Fu y mogoman

Sabía que tenía que estar en algún lugar de config.yml ... y poder probarlo contra el

app/console doctrine:mapping:info

realmente ayudó!

De hecho, este comando simplemente se detiene en un error ... sin comentarios, pero cuando todo está bien, debería poder ver todas sus entidades en la lista.


3

Resolví la misma excepción al eliminar un archivo orm.php generado automáticamente en conflicto en la carpeta Resources / config / doctrine del paquete; según la documentación: "Un paquete solo puede aceptar un formato de definición de metadatos. Por ejemplo, no es posible mezclar definiciones de metadatos YAML con definiciones de clases de entidad PHP anotadas".


Gracias. Me ahorraste mucho tiempo. Obtuve este error después de crear una Entidad con formato php, luego la eliminé y creé una nueva entidad anotada con el mismo nombre.
iMx

1

Muy alta posibilidad de que tenga PHP 5.3.16 (Symfony 2.x no funcionará con él). De todos modos, debe cargar la página de verificación en http://you.site.name/config.php Si su proyecto no funcionó en el servidor de alojamiento, las siguientes líneas deben eliminarse en "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.');
}

¡Buena suerte!


0

En mi caso, fui demasiado entusiasta durante una refactorización y borré un archivo yml de doctrina.


0

En mi caso, en mi mac, estaba usando src / MainBundle / Resource / Config / Doctrine, por supuesto que funcionó en Mac pero no funcionó en el servidor Ubuntu de producción. Una vez que se renombró Config a config y Doctrine a doctrine, se encontraron los archivos de mapeo y comenzó a funcionar.


-1

Me deshice del mismo mensaje de error que en su caso usando app / console_dev en lugar de solo app / console

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.