如何解决类xxx不是有效的实体或映射的超类错误


How to solve Class xxx is not a valid entity or mapped super class error

我定义了一个类设置,如下所示:

<?php
use Doctrine'ORM'Mapping as ORM;
/** @ORM'Entity */
class Setting {
    /** @ORM'Column(type="integer")
     *  @ORM'GeneratedValue
     *  @ORM'id
     */
    private $id;
    /** @ORM'Column(length=255, nullable=true) */
    private $displayname;
    /** @ORM'Column(length=255) */
    private $name;
    /** @ORM'Column(type="text") */
    private $value;
    public function __get($name) {
        return $this->$name;
    }
    public function __set($key, $value){
        $this->$key = $value;
    }
    public function getFullName() {
        return $this->name . ' suffix';
    }

    public static function getValue($settingName) {
        $result = '';
        try {
            $setting = em()->createQuery('SELECT s FROM Setting s WHERE s.name = :name')
                ->setParameter('name', $settingName)
                ->getSingleResult();
            $result = $setting->value;
        }
        catch ('Doctrine'ORM'NoResultException $exception) {
        }
        return $result;
    }
}

不幸的是,这给出了一个错误致命错误:Uncaught exception 'Doctrine'ORM'Mapping'MappingException' with message 'Class "Setting" is not a valid entity or mapped super class.' in xxxxx/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/MappingException.php on line 216

如何解决这个问题?

为了解决这个问题,我不得不调用上一个参数为false的Setup::createAnnotationMetadataConfiguration,以避免使用SimpleAnnotationReader,因为您需要AnnotationReader来使用ORM''namespace前缀。

use Doctrine'ORM'Tools'Setup;
use Doctrine'ORM'EntityManager;
$dbParams = array(
    'driver' => 'pdo_mysql',
    'host' => '127.0.0.1',
    'user' => 'root',
    'password' => '', 
    'dbname' => 'db',
);
$path = __DIR__ . '/Entity';
$config = Setup::createAnnotationMetadataConfiguration(array($path), true, null, null, false);
$entityManager = EntityManager::create($dbParams, $config);

找到了解决方案:问题似乎出在SimpleAnnotationReader的使用上。

当像这样配置注释驱动程序时(第二个参数应该为false),它可以工作。

$driver = $config->newDefaultAnnotationDriver(
    APPLICATION_PATH . '/models', false
);