XXX不是一个有效的实体或映射的超类//和配置选项


XXX is not a valid entity or mapped super class // and config options

我刚开始使用Doctrine2,我有一个错误,当我想坚持一个实体。这是我的错误:'类' Myapp'app'entity'user '不是一个有效的实体或映射的超类。'

我的电脑没有安装eAccelerator .

我的应用程序(我不使用Symfony)结构是这样的:

  • MyApp
    • 应用程序
      • 实体
    • 核心
      • 外部
        • 原则

我用:

初始化Doctrine
$classLoader = new ClassLoader('Doctrine', CORE_PATH . 'external');
$classLoader->register();
$cache = new 'Doctrine'Common'Cache'ArrayCache();
$doctrineConfig = new 'Doctrine'ORM'Configuration();
$doctrineConfig->setMetadataCacheImpl($cache);
$doctrineConfig->setQueryCacheImpl($cache);
$driverImpl = $doctrineConfig->newDefaultAnnotationDriver(array(APP_PATH . 'entity'));
$doctrineConfig->setMetadataDriverImpl($driverImpl);
$doctrineConfig->setAutoGenerateProxyClasses(false);
$connectionOptions = array(
    'driver'   => $database['driver'],
    'dbname'   => $database['dbname'],
    'user'     => $database['username'],
    'password' => $database['password']
);
$this->em = EntityManager::create($connectionOptions, $doctrineConfig);

这些行有什么问题?

当我用自动加载器自动加载我的类时,有必要使用Doctrine类加载器吗?

$classLoader = new ClassLoader('myApp'app'entity', APP_PATH . 'entity');
$classLoader->register();
$classLoader = new ClassLoader('myApp'core'entity', CORE_PATH . 'entity');
$classLoader->register();

编辑:我忘记添加实体类

使用Doctrine'ORM'Mapping作为ORM;

/**
 * @ORM'Entity
 */
class user
{
/**
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM'Column(name="username", type="string", length=255)
*/
protected $username;
/**
* @ORM'Column(name="nicename", type="string", length=255)
*/
protected $nicename;
/**
* @ORM'Column(name="email", type="string", length=255)
*/
protected $email;
/**
* @ORM'Column(name="password", type="string", length=255)
*/
protected $password;
//getters
//setters

in php>8.0

必须将config/packages/doctrine.yaml中的映射类型更改为attribute


doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '13'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: attribute # from annotation to attribute
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App'Entity'
                alias: App
```

好的,所以我的实体是正确的,我不需要调用classLoader。

下面的

是正确的初始化:

    $classLoader = new ClassLoader('Doctrine', CORE_PATH . 'external/');
    $classLoader->register();
    AnnotationRegistry::registerFile(CORE_PATH.'external/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
    $cache = new ArrayCache();
    $annotationReader = new AnnotationReader();
    $cacheReader = new CachedReader(
        $annotationReader, 
        $cache          
    );
    $driverChain = new DriverChain();
    $annotationDriver = new AnnotationDriver(
        $annotationReader,
        array(CORE_PATH . 'model/')
    );
    $driverChain->addDriver($annotationDriver, 'gallib'core'model');
    $doctrineConfig = new Configuration();
    $doctrineConfig->setProxyDir(CORE_PATH . 'model/proxy');
    $doctrineConfig->setProxyNamespace('gallib'core'model'proxy');
    $doctrineConfig->setAutoGenerateProxyClasses(true);
    $doctrineConfig->setMetadataDriverImpl($driverChain);
    $doctrineConfig->setMetadataCacheImpl($cache);
    $doctrineConfig->setQueryCacheImpl($cache);
    $database = $this->config->database;
    $connectionOptions = array(
        'driver'   => $database['driver'],
        'dbname'   => $database['dbname'],
        'user'     => $database['username'],
        'password' => $database['password']
    );
    $this->em = EntityManager::create($connectionOptions, $doctrineConfig);