“ คลาส XXX ไม่ใช่เอนทิตีที่ถูกต้องหรือซุปเปอร์คลาสที่แมป” หลังจากย้ายคลาสในระบบไฟล์


93

ฉันมีคลาสเอนทิตีใน Aib \ PlatformBundle \ Entity \ User.php

ฉันไม่มีปัญหาในการพยายามสร้างคลาสแบบฟอร์มผ่าน

php app / console หลักคำสอน: สร้าง: ฟอร์ม AibPlatformBundle: ผู้ใช้

ตอนนี้ฉันได้เปลี่ยนเนมสเปซเป็น Aib \ PlatformBundle \ Entity \ Identity \ User แล้ว แต่เมื่อฉันพยายามสร้างแบบฟอร์มด้วยงานที่ฉันพูดก่อนที่มันจะพูดว่า:

"Class Aib \ PlatformBundle \ Entity \ User ไม่ใช่เอนทิตีที่ถูกต้องหรือซูเปอร์คลาสที่แมป"

นี่คือเนื้อหาของไฟล์:

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

ความคิดใด ๆ ?

symfony2.0.4


คุณมีคลาสที่ขยายผู้ใช้ที่คุณลืมอัปเดตเนมสเปซหรือไม่?
ปัญหา

3
เท่าที่ฉันทราบเป็นไปไม่ได้ที่จะกำหนดชื่อย่อยสำหรับเอนทิตีของคุณเนื่องจาก Symfony จะพยายามแก้ไขAibPlatformBundle: ผู้ใช้เป็นAim \ PlatformBundle \ Entity \ Userเสมอไม่ว่าจะเป็นเนมสเปซใดก็ตาม
Alessandro Desantis

คำตอบ:


228

มีปัญหานี้ - อย่าลืมคำอธิบายประกอบ* @ORM\Entityด้านล่าง:

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

16

มีปัญหานี้เมื่อวานนี้และพบหัวข้อนี้ ฉันสร้างเอนทิตีด้วยการแมปในกลุ่มใหม่ (เช่น MyFooBundle / Entity / User.php) ทำการกำหนดค่าทั้งหมดตามเอกสาร แต่ได้รับข้อผิดพลาดเดียวกันจากด้านบนเมื่อพยายามโหลดแอป

ในที่สุดฉันก็รู้ว่าฉันไม่ได้โหลด MyFooBundle ใน AppKernel:

new My\FooBundle\MyFooBundle()

วิธีที่ยอดเยี่ยมในการดีบักคือรันคำสั่งนี้:

app/console doctrine:mapping:info

13

ตรวจสอบไฟล์ config.yml ของคุณควรมีสิ่งนี้:

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

เพิ่มบันเดิลของคุณเองในรายการการแมป


ไชโย !! การกำหนดค่าของฉัน (จาก Sonata) มีการแมป: ~ ไม่ได้ระบุชุดใด ๆ .. การเพิ่มด้วยตนเองช่วยแก้ไขปัญหาของฉันได้ :)
shousper

10

ฉันจะแก้ไขเรื่องนี้โดยการส่งผ่านเป็นพารามิเตอร์ที่สองไปfalseDoctrine\ORM\Configuration::newDefaultAnnotationDriver

ฉันใช้เวลาสักพักในการขุดค้นผ่าน Google และซอร์สโค้ด

กรณีของฉันเป็นแบบพิเศษเนื่องจากฉันใช้การแมปที่ชี้ไปยังไดเรกทอรีอื่นที่ไม่เกี่ยวข้องกับการติดตั้ง Symfony เนื่องจากฉันต้องใช้รหัสเดิมด้วย

ฉันได้ปรับโครงสร้างเอนทิตีเดิมแล้วและพวกเขาหยุดทำงาน พวกเขาเคยใช้@Annotationแทน@ORM\Annotationดังนั้นหลังจากปรับโครงสร้างใหม่แล้วก็ล้มเหลวในการอ่านข้อมูลเมตา การไม่ใช้โปรแกรมอ่านคำอธิบายประกอบแบบธรรมดาทุกอย่างดูเหมือนจะโอเค


9

ในกรณีของปัญหาถูกแก้ไขโดยการเปลี่ยนแคชเซิร์ฟเวอร์ของฉันจากeAcceleratorเพื่อAPC เห็นได้ชัดว่า eAccelerator จะดึงความคิดเห็นทั้งหมดออกจากไฟล์ที่ทำลายคำอธิบายประกอบของคุณ


Opcache มีการตั้งค่าเพื่อปิดใช้งานการตัดความคิดเห็นopcache.save_comments=1บางทีอาจมี eAccelerator / APC ด้วย?
Oylex

9

ฉันแก้ไขปัญหานี้โดยการตั้งค่า$useSimpleAnnotationReader=falseเมื่อสร้างไฟล์MetaDataConfiguration.


7

ขอบคุณมากสำหรับ Mark Fu และ mogoman

ฉันรู้ว่ามันต้องอยู่ที่ไหนสักแห่งใน config.yml ... และสามารถทดสอบกับไฟล์

app/console doctrine:mapping:info

ช่วยได้จริงๆ!

ในความเป็นจริงคำสั่งนี้เพียงแค่หยุดที่ข้อผิดพลาด ... ไม่มีข้อเสนอแนะ แต่เมื่อทุกอย่างเรียบร้อยดีคุณควรจะเห็นเอนทิตีทั้งหมดของคุณอยู่ในรายการ


3

ฉันแก้ไขข้อยกเว้นเดียวกันโดยการลบไฟล์ orm.php ที่สร้างโดยอัตโนมัติที่ขัดแย้งกันในโฟลเดอร์ Resources / config / doctrine ของบันเดิล ตามเอกสาร: "บันเดิลสามารถยอมรับรูปแบบการกำหนดเมทาดาทาได้เพียงรูปแบบเดียวตัวอย่างเช่นไม่สามารถผสมนิยามข้อมูลเมตาของ YAML กับนิยามคลาสเอนทิตี PHP ที่มีคำอธิบายประกอบได้"


ขอบคุณ. คุณช่วยฉันได้มากเวลา ได้รับข้อผิดพลาดนี้หลังจากสร้างเอนทิตีในรูปแบบ php แล้วกว่าจะลบออกและสร้างเอนทิตีที่มีคำอธิบายประกอบใหม่ด้วยชื่อเดียวกัน
iMx

1

มีความเป็นไปได้สูงมากที่คุณจะมี PHP 5.3.16 (Symfony 2.x จะใช้งานไม่ได้) อย่างไรก็ตามคุณควรโหลดหน้าตรวจสอบบนhttp://you.site.name/config.php หากคุณมีโปรเจ็กต์ไม่ทำงานบนเซิร์ฟเวอร์โฮสติ้งบรรทัดถัดไปจะต้องถูกลบออกใน "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.');
}

โชคดี!


0

ในกรณีของฉันฉันมีความกระตือรือร้นมากเกินไปในระหว่างการอ้างอิงและได้ลบไฟล์ yml หลักคำสอน!


0

ในกรณีของฉันบน Mac ของฉันฉันใช้ src / MainBundle / Resource / Config / Doctrine แน่นอนว่ามันใช้งานได้บน Mac แต่ใช้ไม่ได้กับเซิร์ฟเวอร์ Ubuntu ที่ใช้งานจริง เมื่อเปลี่ยนชื่อ Config เป็น config และ Doctrine to Doctrine พบไฟล์การแมปและเริ่มทำงาน


-1

ฉันกำจัดข้อความแสดงข้อผิดพลาดเดียวกันกับในกรณีของคุณโดยใช้ app / console_dev แทนที่จะเป็นเพียงแอป / คอนโซล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.