"Kelas XXX bukan entitas yang valid atau kelas super yang dipetakan" setelah memindahkan kelas dalam sistem file

93

Saya memiliki kelas entitas di Aib \ PlatformBundle \ Entity \ User.php

Saya tidak punya masalah mencoba membuat kelas bentuknya melalui

doktrin aplikasi / konsol php: menghasilkan: bentuk AibPlatformBundle: Pengguna

Sekarang saya telah mengubah namespace menjadi Aib \ PlatformBundle \ Entity \ Identity \ User, tetapi ketika saya mencoba membuat formulir dengan tugas yang saya katakan sebelumnya mengatakan:

"Kelas Aib \ PlatformBundle \ Entity \ Pengguna bukan entitas yang valid atau kelas super yang dipetakan."

Ini adalah isi 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
    {
    ...

Ada ide?

symfony2.0.4

ziiweb
sumber
Apakah Anda memiliki kelas yang memperluas Pengguna yang Anda lupa perbarui namespace?
Bermasalah
3
Sejauh yang saya tahu, subnamespace untuk entitas Anda tidak dapat ditentukan, karena Symfony akan selalu mencoba menyelesaikan AibPlatformBundle: User to Aim \ PlatformBundle \ Entity \ User , terlepas dari namespace-nya.
Alessandro Desantis

Jawaban:

228

Punya masalah ini - jangan lupa anotasi * @ORM\Entityseperti di bawah ini:

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

Mengalami masalah ini kemarin dan menemukan utas ini. Saya membuat entitas dengan pemetaan dalam bundel baru (misalnya MyFooBundle / Entity / User.php), melakukan semua konfigurasi sesuai dengan dokumen tetapi mendapat kesalahan yang sama dari atas ketika mencoba memuat aplikasi.

Pada akhirnya saya menyadari bahwa saya tidak memuat MyFooBundle di AppKernel:

new My\FooBundle\MyFooBundle()

Cara terbaik untuk men-debug ini adalah dengan menjalankan perintah ini:

app/console doctrine:mapping:info
mogoman
sumber
13

Periksa file config.yml Anda, harus berisi sesuatu seperti ini:

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

Tambahkan bundel Anda sendiri ke daftar pemetaan.

Mark Fu
sumber
Bersulang!! Konfigurasi saya (dari Sonata) baru saja memetakan: ~, tidak menentukan bundel apa pun .. Menambahkannya secara manual memperbaiki masalah saya :)
shousper
10

Saya menyelesaikan ini dengan meneruskan falsesebagai parameter kedua ke Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Saya butuh beberapa saat untuk menggali melalui Google dan kode sumber.

Kasus saya agak istimewa karena saya menggunakan pemetaan yang menunjuk ke direktori lain yang tidak terkait dengan instalasi Symfony karena saya juga harus menggunakan kode lama.

Saya telah merefaktor entitas lama dan mereka berhenti bekerja. Mereka biasanya menggunakan @Annotationalih-alih @ORM\Annotation, jadi setelah pemfaktoran ulang itu gagal membaca metadata. Dengan tidak menggunakan pembaca anotasi sederhana, semuanya tampak baik-baik saja.

wucdbm.dll
sumber
9

Dalam kasus saya, masalahnya diselesaikan dengan mengubah cache server saya dari eAccelerator ke APC . Rupanya eAccelerator menghapus semua komentar dari file yang merusak anotasi Anda.

Christian Vermeulen
sumber
Opcache memiliki pengaturan untuk menonaktifkan penghapusan komentar opcache.save_comments=1, mungkinkah ada juga untuk eAccelerator / APC?
Oylex
9

Saya menyelesaikan masalah ini dengan mengatur $useSimpleAnnotationReader=falsesaat membuat file MetaDataConfiguration.

gruentee
sumber
7

terima kasih banyak untuk Mark Fu dan mogoman

Saya tahu itu pasti ada di suatu tempat di config.yml ... dan bisa mengujinya terhadap file

app/console doctrine:mapping:info

sangat membantu!

Faktanya, perintah ini hanya berhenti saat terjadi kesalahan ... tidak ada umpan balik, tetapi ketika semuanya baik-baik saja, Anda seharusnya dapat melihat semua entitas Anda terdaftar.

MediaVince
sumber
3

Saya menyelesaikan pengecualian yang sama dengan menghapus file orm.php yang dibuat secara otomatis dan berkonflik di folder Resources / config / doktrin bundel; menurut dokumentasi: "Sebuah paket hanya dapat menerima satu format definisi metadata. Misalnya, tidak mungkin mencampur definisi metadata YAML dengan definisi kelas entitas PHP beranotasi."

Teater Cartesian
sumber
Terima kasih. Anda menghemat banyak waktu. Dapatkan kesalahan ini setelah membuat Entitas berformat php, lalu menghapusnya dan membuat entitas beranotasi baru dengan nama yang sama.
iMx
1

Kemungkinan besar Anda memiliki PHP 5.3.16 (Symfony 2.x tidak akan berfungsi dengannya). Bagaimanapun Anda harus memuat halaman periksa di http://you.site.name/config.php Jika Anda memiliki proyek yang tidak bekerja di server hosting, baris berikutnya harus dihapus di "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.');
}

Semoga berhasil!

Stanislav Terletskyi
sumber
0

Dalam kasus saya, saya terlalu bersemangat selama refactor dan telah menghapus file yml doktrin!

jhchnc
sumber
0

Dalam kasus saya di mac saya, saya menggunakan src / MainBundle / Resource / Config / Doctrine, tentu saja ini berfungsi di Mac tetapi tidak berfungsi di server produksi Ubuntu. Setelah berganti nama Config menjadi config dan Doctrine menjadi doktrin, file pemetaan ditemukan dan mulai bekerja.

rashidkhan
sumber
-1

Saya menghilangkan pesan kesalahan yang sama seperti dalam kasus Anda dengan menggunakan app / console_dev, bukan hanya app / console

mediafreakch
sumber