“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

ziiweb
fonte
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")
 */
Mike
fonte
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
mogoman
fonte
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.

Mark Fu
fonte
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.

wucdbm
fonte
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.

Christian Vermeulen
fonte
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.

gruentee
fonte
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.

MediaVince
fonte
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."

Teatro cartesiano
fonte
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!

Stanislav Terletskyi
fonte
0

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

jhchnc
fonte
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.

Rashidkhan
fonte
-1

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

mediafreakch
fonte