“Classe XXX não é uma entidade válida ou superclasse mapeada” após mover a classe no sistema de arquivos


91

Eu tinha uma classe de entidade em Aib \ PlatformBundle \ Entity \ User.php

Não tive problemas para tentar criar sua classe de formulário por meio

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

Agora mudei o namespace para Aib \ PlatformBundle \ Entity \ Identity \ User, mas quando tento gerar o formulário com a tarefa, disse antes:

"A classe Aib \ PlatformBundle \ Entity \ User não é uma entidade válida ou superclasse mapeada."

Este é o conteúdo do arquivo:

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

Qualquer ideia?

symfony2.0.4


Você tem alguma classe estendendo User para a qual você se esqueceu de atualizar os namespaces?
Problemático de

3
Pelo que eu sei, não é possível definir subnamespaces para suas entidades, uma vez que Symfony sempre tentará resolver AibPlatformBundle: User para Aim \ PlatformBundle \ Entity \ User , independentemente de seu namespace.
Alessandro Desantis

Respostas:


227

Tive este problema - não se esqueça da anotação * @ORM\Entitycomo abaixo:

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

15

Tive esse problema ontem e encontrei este tópico. Criei a entidade com o mapeamento em um novo bundle (ex: MyFooBundle / Entity / User.php), fiz toda a configuração de acordo com a docs mas obtive o mesmo erro acima ao tentar carregar o aplicativo.

No final, percebi que não estava carregando MyFooBundle no AppKernel:

new My\FooBundle\MyFooBundle()

Uma ótima maneira de depurar isso é executar este comando:

app/console doctrine:mapping:info

13

Verifique seu arquivo config.yml, deve conter algo assim:

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

Adicione seu próprio pacote à lista de mapeamentos.


Felicidades!! Minha configuração (do Sonata) tinha apenas mapeamentos: ~, não especificando nenhum pacote ..
Adicioná-

10

Resolvi isso passando falsecomo o segundo parâmetro para Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Levei um tempo vasculhando o Google e o código-fonte.

Meu caso era meio especial, já que eu estava usando um mapeamento apontando para outro diretório não relacionado à instalação do Symfony, pois também tive que usar código legado.

Eu refatorei entidades legadas e elas pararam de funcionar. Eles costumavam usar em @Annotationvez de @ORM\Annotation, portanto, após a refatoração, simplesmente falhava na leitura dos metadados. Por não usar um simples leitor de anotações, tudo parece normal.


8

No meu caso, o problema foi resolvido alterando o cache do meu servidor de eAccelerator para APC . Aparentemente, o eAccelerator remove todos os comentários dos arquivos, o que quebra suas anotações.


Opcache tem uma configuração para desativar a remoção de comentários opcache.save_comments=1, talvez haja um também para eAccelerator / APC?
Oylex

8

Resolvi esse problema definindo $useSimpleAnnotationReader=falseao criar o MetaDataConfiguration.


7

muito obrigado a Mark Fu e mogoman

Eu sabia que tinha que estar em algum lugar no config.yml ... e ser capaz de testá-lo contra o

app/console doctrine:mapping:info

realmente ajudou!

Na verdade, este comando simplesmente para em um erro ... sem feedback, mas quando tudo estiver bem, você deverá ser capaz de ver todas as suas entidades listadas.


3

Resolvi a mesma exceção excluindo um arquivo orm.php autogenerated conflitante na pasta Resources / config / doctrine do pacote; de acordo com a documentação: "Um pacote pode aceitar apenas um formato de definição de metadados. Por exemplo, não é possível misturar definições de metadados YAML com definições de classe de entidade PHP anotadas."


Obrigado. Você me economizou muito tempo. Recebi este erro após criar uma Entidade formatada em php, então a excluí e criou uma nova entidade anotada com o mesmo nome.
iMx

1

Possibilidade muito alta de que você tenha o PHP 5.3.16 (Symfony 2.x não funcionará com ele). De qualquer forma, você deve carregar a página de verificação em http://you.site.name/config.php Se você teve o projeto não funcionado no servidor de hospedagem, as próximas linhas devem ser removidas em "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.');
}

Boa sorte!


0

No meu caso, fui muito zeloso durante uma refatoração e excluí um arquivo yml de doutrina!


0

No meu caso no meu mac eu estava usando src / MainBundle / Resource / Config / Doctrine, claro que funcionou no Mac, mas não funcionou no servidor Ubuntu de produção. Depois de renomeado Config para config e Doctrine para doctrine, os arquivos de mapeamento foram encontrados e começou a funcionar.


-1

Eu me livrei da mesma mensagem de erro do seu caso usando app / console_dev em vez de apenas app / console

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.