我有一个可疑的问题。我有一组现有的带注释的Doctrine实体,这些实体已成功用于Symfony2/Doctrine2项目。但是,我目前正在将此项目的一些核心功能隔离到它自己的 Web 框架独立库中,我似乎无法让实体正常运行。
目前,我主要担心的是Doctrine CLI实用程序给我的结果好坏参半。
当我执行以下操作时:
bin/doctrine orm:validate-schema
我得到以下输出:
[Mapping] OK - The mapping files are correct.
[Database] OK - The database schema is in sync with the mapping files.
但是当我这样做时:
bin/doctrine orm:info
我明白这个:
[Exception]
You do not have any mapped Doctrine ORM entities according to the current configuration. If you have entities or mapping files you should check your mapping configuration for errors.
我已经检查了无数次我的配置。我什至删除了我所有的实体,并在其中留下了一个最基本的用户实体,给了我相同的场景。
这些好坏参半的结果可能是什么?
事实证明,设置的标准 Doctrine 配置 [1] 不适用于我的代码库或我测试过的任何代码库,也许文档已经过时了。在互联网上耕耘了几个小时之后,这是最终使它为我工作的配置:
use DoctrineORMToolsSetup;
use DoctrineORMEntityManager;
use DoctrineCommonAnnotationsAnnotationReader;
$paths = array( realpath(__DIR__."/../src/My/Entity") );
$isDevMode = TRUE;
// the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => 'myuser',
'password' => 's3cr3t',
'dbname' => 'mydb',
);
$cache = new DoctrineCommonCacheArrayCache();
$reader = new AnnotationReader();
$driver = new DoctrineORMMappingDriverAnnotationDriver($reader, $paths);
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$config->setMetadataCacheImpl( $cache );
$config->setQueryCacheImpl( $cache );
$config->setMetadataDriverImpl( $driver );
$entityManager = EntityManager::create($dbParams, $config);
//-- This I had to add to support the Mysql enum type.
$platform = $entityManager->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
[1] http://docs.doctrine-project.org/en/latest/tutorials/getting-started.html
接受的答案是可以的,但同样的事情可以用不那么冗长的方式实现:
use DoctrineORMToolsSetup;
use DoctrineORMEntityManager;
$paths = array( realpath(__DIR__."/../src/My/Entity") );
$isDevMode = TRUE;
// the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => 'myuser',
'password' => 's3cr3t',
'dbname' => 'mydb',
);
$config = Setup::createAnnotationMetadataConfiguration(
$paths, $isDevMode, null, null, false
);
$config->setQueryCacheImpl(new DoctrineCommonCacheArrayCache());
$entityManager = EntityManager::create($dbParams, $config);
//-- This I had to add to support the Mysql enum type.
$platform = $entityManager->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
这里只是关于是否使用简单的注释驱动程序(Setup::createAnnotationMetadataConfiguration 函数的最后一个参数。默认情况下,使用简单的批注驱动程序,该驱动程序无法识别 @ORM\Entity 批注。
我在Ressources/config/doctrine/Foo.orm.php
中有PHP实体但我使用注释。
对orm = [Exception]
来说太不同了
根据当前配置,您没有任何映射的教义ORM实体。如果您有实体或映射文件,则应检查映射配置是否存在错误。
只需删除错误的实体文件
对我来说,碰巧我从其他系统导入了供应商目录,但它无法正常工作。
一个简单的composer install
或php composer.phar install
修复它。