source

파일 시스템에서 클래스를 이동한 후 "클래스 XXX가 유효한 엔티티 또는 매핑된 슈퍼 클래스가 아닙니다"

gigabyte 2022. 11. 18. 21:27
반응형

파일 시스템에서 클래스를 이동한 후 "클래스 XXX가 유효한 엔티티 또는 매핑된 슈퍼 클래스가 아닙니다"

Aib\PlatformBundle에서 엔티티 클래스를 받았습니다.엔티티\사용자php

폼클래스를 만드는 데 문제가 없었습니다.

php app/console 원칙: 생성: 양식 AibPlatformBundle:사용자

네임스페이스를 Aib\PlatformBundle\로 변경했습니다.엔티티\아이덴티티\사용자, 하지만 이전에 말한 작업으로 폼을 생성하려고 하면 다음과 같이 표시됩니다.

"클래스 Aib\Platform Bundle\"엔티티\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
    {
    ...

감 잡히는 게 없어요?

symfony 2.0.4

? - 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,* @ORM\Entity음음음같 뭇매하다

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

어제 이 문제가 있어서 이 스레드를 찾았습니다.새로운 번들(MyFooBundle/Entity/User.php 등)에 매핑된 엔티티를 생성하여 모든 설정을 문서에 따라 수행했지만 앱을 로드하려고 할 때 위에서 동일한 오류가 발생했습니다.

결국 AppKernel에서 MyFooBundle을 로드하지 않았다는 것을 깨달았습니다.

new My\FooBundle\MyFooBundle()

이를 디버깅하는 가장 좋은 방법은 다음 명령을 실행하는 것입니다.

app/console doctrine:mapping:info

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

독자적인 번들을 매핑목록에 추가합니다.

이 문제는 설정으로 해결했습니다.$useSimpleAnnotationReader=falseMetaDataConfiguration.

는 이 했습니다.false로서 「」를 참조해 주세요.Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

구글과 소스코드를 뒤지는 데 시간이 좀 걸렸다.

Symfony 설치와 무관한 다른 디렉토리를 가리키는 매핑을 사용하고 있었기 때문에 레거시 코드도 사용해야 했기 때문에 특별한 경우가 있었습니다.

레거시 엔티티를 리팩터링했더니 작동을 멈췄습니다.그들은 예전에@Annotation@ORM\Annotation리팩터링 후 메타데이터를 읽지 못했습니다.간단한 주석 리더를 사용하지 않으면 모든 것이 괜찮아 보입니다.

제 경우 서버 캐시를 eAccelerator에서 APC로 변경함으로써 문제가 해결되었습니다.eAccelerator가 파일에서 주석을 모두 삭제하여 주석을 끊는 것 같습니다.

마크 푸와 거물에게 큰 일

난 그게 구성 어딘가에 있을 거란 걸 알았어.yml...테스트 할 수 있습니다.

app/console doctrine:mapping:info

정말 도움이 됐어요!

사실 이 명령어는 단순히 오류로 인해 정지됩니다.피드백은 없지만, 모든 것이 정상일 때 나열된 모든 엔티티를 볼 수 있습니다.

설명서에 따르면 번들의 Resources/config/doctrine 폴더에서 충돌하는 자동 생성된 orm.php 파일을 삭제하여 동일한 예외를 해결했습니다.예를 들어 YAML 메타데이터 정의를 주석이 달린 PHP 엔티티 클래스 정의와 함께 사용할 수 없습니다."

PHP 5.3.16을 사용하고 있을 가능성이 매우 높습니다(Symfony 2.x는 PHP 5.3.16에서는 동작하지 않습니다).어쨌든 체크 페이지를 http://you.site.name/config.php에 로드해야 합니다.호스팅 서버에서 프로젝트가 작동하지 않으면 다음 행을 "config.disc"에서 삭제해야 합니다.

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.');
}

행운을 빕니다.

  1. 엔티티에 적절한 엔티티 및 테이블 주석이 있어야 합니다(순서는 중요할 수 있으므로 둘 다 시도해 보십시오).
  2. 커스텀 저장소가 있는 경우에는 반드시 엔티티 클래스 자체($entityManager->getRepository("your ENTITY class name")를 통해 액세스해야 합니다.이는 Repo 클래스가 엔티티티 자체여야 한다고 생각하도록 Repo 클래스를 속이기 때문입니다.바보같지만 독트린은 구별하기 힘들지 않다.

제 실수는 제가 한 거였어요

$em->getRepository(EntityRepository::class)

대신

$em->getRepository(Entity::class)

내 경우 리팩터 중에 너무 열성적이어서 교리 yml 파일을 삭제했다!

Mac에서는 src/MainBundle/Resource/Config/Doctrine을 사용하고 있었습니다.물론 Mac에서는 동작했지만 실제 가동 중인 Ubuntu 서버에서는 동작하지 않았습니다.Config에서 Config로, Autrin에서 교리로 이름이 바뀌면 매핑 파일이 발견되어 작동하기 시작했습니다.

내 경우 make:entity를 만든 후 다음 명령을 시도했습니다.

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity데이터베이스로부터 엔티티를 생성합니다.단, 이 명령어는 컨트롤러 내에서 엔티티를 사용하거나 나중에 사용할 경우 알 수 없는 메서드오류(getId 등)를 발생시키는 getters 및 setters를 제공하지 않습니다.그래서 생성된 엔티티티로 돌아가기로 했습니다.

php bin/console make:entity

그래서 누락된 메서드를 다시 가져올 수 있지만 안타깝게도 오류 클래스가 유효한 엔티티 또는 매핑된 슈퍼 클래스가 아닙니다.이 오류를 방지하기 위해 이 문서를 읽을 인내심이 없습니다.

[1]: https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/tutorials/override-field-association-mappings-in-subclasses.html#override-field-association-mappings-in-subclasses 특히 주석 대신 속성을 사용하고 있기 때문에 생성된 엔티티를 가져와 getters를 생성하는 다음 명령을 추가했을 뿐입니다.및 세터$ php bin/console make:entity --regenerate App는 왜 이 이 알 수 .

app/console이 아닌 app/console_dev를 사용하여 당신의 경우와 동일한 오류 메시지를 제거하였습니다.

언급URL : https://stackoverflow.com/questions/7820597/class-xxx-is-not-a-valid-entity-or-mapped-super-class-after-moving-the-class-i

반응형