“Lớp XXX không phải là thực thể hợp lệ hoặc siêu lớp được ánh xạ” sau khi di chuyển lớp trong hệ thống tệp


91

Tôi có một lớp thực thể trong Aib \ PlatformBundle \ Entity \ User.php

Tôi không gặp vấn đề gì khi cố tạo lớp biểu mẫu của nó thông qua

học thuyết về ứng dụng / bàn điều khiển php: create: form AibPlatformBundle: Người dùng

Bây giờ tôi đã thay đổi không gian tên thành Aib \ PlatformBundle \ Entity \ Identity \ Người dùng, nhưng khi tôi cố gắng tạo biểu mẫu với tác vụ tôi đã nói trước khi nó nói:

"Class Aib \ PlatformBundle \ Entity \ User không phải là một thực thể hợp lệ hoặc siêu lớp được ánh xạ."

Đây là nội dung tệp:

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

Bất kỳ ý tưởng?

symfony2.0.4


Bạn có bất kỳ lớp nào mở rộng Người dùng mà bạn quên cập nhật không gian tên không?
Có vấn đề

3
Theo như tôi biết, không thể xác định không gian tên phụ cho các thực thể của bạn, vì Symfony sẽ luôn cố gắng giải quyết AibPlatformBundle: Người dùng thành Aim \ PlatformBundle \ Entity \ Người dùng , bất kể không gian tên của nó.
Alessandro Desantis

Câu trả lời:


227

Gặp sự cố này - đừng quên chú thích * @ORM\Entitynhư dưới đây:

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

15

Đã có vấn đề này ngày hôm qua và tìm thấy chủ đề này. Tôi đã tạo thực thể bằng ánh xạ trong một gói mới (ví dụ: MyFooBundle / Entity / User.php), đã thực hiện tất cả cấu hình theo tài liệu nhưng gặp lỗi tương tự từ phía trên khi cố gắng tải ứng dụng.

Cuối cùng, tôi nhận ra rằng tôi không tải MyFooBundle trong AppKernel:

new My\FooBundle\MyFooBundle()

Một cách tuyệt vời để gỡ lỗi này là chạy lệnh này:

app/console doctrine:mapping:info

13

Hãy kiểm tra tệp config.yml của bạn, phải chứa một cái gì đó như sau:

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

Thêm nhóm của riêng bạn vào danh sách ánh xạ.


Chúc mừng !! Cấu hình của tôi (từ Sonata) chỉ có ánh xạ: ~, không chỉ định bất kỳ gói nào .. Thêm chúng theo cách thủ công đã khắc phục sự cố của tôi :)
shousper

10

Tôi đã giải quyết điều này bằng cách chuyển falsedưới dạng tham số thứ hai tới Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Tôi đã mất một thời gian tìm hiểu Google và mã nguồn.

Trường hợp của tôi khá đặc biệt vì tôi đang sử dụng ánh xạ trỏ đến một thư mục khác không liên quan đến cài đặt Symfony vì tôi cũng phải sử dụng mã kế thừa.

Tôi đã cấu trúc lại các thực thể kế thừa và chúng ngừng hoạt động. Họ đã từng sử dụng@Annotation thay vì @ORM\Annotation, vì vậy sau khi cấu trúc lại, nó chỉ đơn giản là không đọc được siêu dữ liệu. Bằng cách không sử dụng trình đọc chú thích đơn giản, mọi thứ dường như trở nên ổn.


8

Trong trường hợp của tôi, sự cố đã được giải quyết bằng cách thay đổi bộ nhớ đệm máy chủ của tôi từ eAccelerator thành APC . Rõ ràng eAccelerator loại bỏ tất cả các nhận xét từ các tệp làm hỏng các chú thích của bạn.


Opcache có một cài đặt để tắt tính năng tước nhận xét opcache.save_comments=1, có lẽ cũng có một cài đặt cho eAccelerator / APC?
Oylex

8

Tôi đã giải quyết vấn đề này bằng cách đặt $useSimpleAnnotationReader=falsekhi tạo MetaDataConfiguration.


7

đại gia cho Mark Fu và mogoman

Tôi biết nó phải ở đâu đó trong config.yml ... và có thể kiểm tra nó với

app/console doctrine:mapping:info

thực sự đã giúp!

Trên thực tế, lệnh này chỉ dừng lại ở một lỗi ... không có phản hồi, nhưng khi mọi thứ đều ổn, bạn sẽ có thể xem tất cả các thực thể của mình được liệt kê.


3

Tôi đã giải quyết ngoại lệ tương tự bằng cách xóa tệp orm.php được tạo tự động xung đột trong thư mục Tài nguyên / config / học thuyết của gói; theo tài liệu: "Một gói chỉ có thể chấp nhận một định dạng định nghĩa siêu dữ liệu. Ví dụ: không thể kết hợp các định nghĩa siêu dữ liệu YAML với các định nghĩa lớp thực thể PHP có chú thích."


Cảm ơn bạn. Bạn đã tiết kiệm cho tôi rất nhiều thời gian. Gặp lỗi này sau khi tạo Đối tượng có định dạng php, hơn là đã xóa đối tượng đó và tạo đối tượng được chú thích mới có cùng tên.
iMx

1

Khả năng rất cao là bạn có PHP 5.3.16 (Symfony 2.x sẽ không hoạt động với nó). Dù sao bạn cũng nên tải trang kiểm tra trên http://you.site.name/config.php Nếu dự án của bạn không hoạt động trên máy chủ lưu trữ, các dòng tiếp theo phải được xóa trong "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.');
}

Chúc may mắn!


0

Trong trường hợp của tôi, tôi đã quá sốt sắng trong quá trình tái cấu trúc và đã xóa một tệp yml học thuyết!


0

Trong trường hợp của tôi trên máy Mac của tôi, tôi đang sử dụng src / MainBundle / Resource / Config / Doctrine, tất nhiên nó hoạt động trên Mac nhưng nó không hoạt động trên máy chủ Ubuntu sản xuất. Sau khi đổi tên Cấu hình thành cấu hình và Doctrine thành học thuyết, các tệp ánh xạ được tìm thấy và nó bắt đầu hoạt động.


-1

Tôi đã loại bỏ thông báo lỗi tương tự như trong trường hợp của bạn bằng cách sử dụng app / console_dev thay vì chỉ app / console

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.