Php 原则2-orm不处理元数据类:生成存储库
我正在尝试生成实体存储库并获得这样的消息 没有要处理的元数据类 我已经查到了这种用法 使用条令\ORM\Mapping作为ORM; 及 @ORM\Table 它不能正常工作 如果我将所有@ORM\Table更改为仅@Table(和其他注释),它将开始工作,但我真的不想这样做,因为它应该与@ORM注释一起工作 我按照下面一页的指示做,但运气不好。我知道我很接近,但缺少文件路径或名称空间。请帮忙 有人有这样的问题吗?我错过了什么 cli配置Php 原则2-orm不处理元数据类:生成存储库,php,orm,doctrine-orm,Php,Orm,Doctrine Orm,我正在尝试生成实体存储库并获得这样的消息 没有要处理的元数据类 我已经查到了这种用法 使用条令\ORM\Mapping作为ORM; 及 @ORM\Table 它不能正常工作 如果我将所有@ORM\Table更改为仅@Table(和其他注释),它将开始工作,但我真的不想这样做,因为它应该与@ORM注释一起工作 我按照下面一页的指示做,但运气不好。我知道我很接近,但缺少文件路径或名称空间。请帮忙 有人有这样的问题吗?我错过了什么 cli配置 use Doctrine\Common\Annotati
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
require_once 'Doctrine/Common/ClassLoader.php';
define('APPLICATION_ENV', "development");
error_reporting(E_ALL);
//AnnotationRegistry::registerFile("Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php");
//AnnotationRegistry::registerAutoloadNamespace("Symfony\Component\Validator\Constraint", "Doctrine/Symfony");
//AnnotationRegistry::registerAutoloadNamespace("Annotations", "/Users/ivv/workspaceShipipal/shipipal/codebase/application/persistent/");
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__ . '/application/');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__ . '/application/persistent');
$classLoader->register();
$config = new \Doctrine\ORM\Configuration();
$config->setProxyDir(__DIR__ . '/application/persistent/Proxies');
$config->setProxyNamespace('Proxies');
$config->setAutoGenerateProxyClasses((APPLICATION_ENV == "development"));
$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__ . "/application/persistent/Entities"));
$config->setMetadataDriverImpl($driverImpl);
if (APPLICATION_ENV == "development") {
$cache = new \Doctrine\Common\Cache\ArrayCache();
} else {
$cache = new \Doctrine\Common\Cache\ApcCache();
}
$config->setMetadataCacheImpl($cache);
$config->setQueryCacheImpl($cache);
$connectionOptions = array(
'driver' => 'pdo_mysql',
'host' => '127.0.0.1',
'dbname' => 'mydb',
'user' => 'root',
'password' => ''
);
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
$platform = $em->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
php(工作版本,最初如所述,@Table是@ORM\Table,其他类似的注释有@ORM\part,如@ORM\Column等)
除了在Symfony2项目中,我在任何地方都找不到对@ORM\Table
的任何引用。在文档中,它始终被引用为@Table
我知道它在sf2中工作(我在那里使用它)。是否可能是Doctrine中普通安装的错误?最可能的解释是,正如您所述,无论是在读卡器中还是在实体中,include(名称空间问题、路径问题等)都有问题。编辑3:
如果重要的话,我用的是2.2.1条。不管怎样,我只是在这个话题上添加了更多的信息
我深入研究了Doctrine\Configuration.php类,以了解newDefaultAnnotationDriver是如何创建AnnotationDriver的。该方法从第125行开始,但如果您使用的是公共库的最新版本,则相关部分是第145到147行
} else {
$reader = new AnnotationReader();
$reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
}
我在AnnotationReader类中找不到setDefaultAnnotationNamespace方法。所以这很奇怪。但我假设它设置了名称空间原则\Orm\Mapping,因此该名称空间中的注释不需要前缀。因此出现了错误,因为doctrine cli工具生成实体的方式似乎有所不同。我不知道这是为什么
您会注意到,在我下面的回答中,我没有调用setDefaultAnnotationNamespace方法
一方面,我注意到在用户实体类中有使用条令\映射作为ORM
。生成的文件不应该创建使用条令\Orm\Mapping作为Orm代码>?或者这是一个打字错误
编辑1:
好的,我发现了问题。显然,它与\doctor\ORM\Configuration类使用的默认注释驱动程序有关
因此,您不需要使用$config->newDefaultAnnotationDriver(…)
,而需要实例化一个新的AnnotationReader和一个新的AnnotationDriver,然后在配置类中进行设置
例如:
AnnotationRegistry::registerFile("Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php");
$reader = new AnnotationReader();
$driverImpl = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($reader, array(__DIR__ . "/application/persistent/Entities"));
$config->setMetadataDriverImpl($driverImpl);
EDIT2(这里是添加到cli config.php中的调整):
当从条令2.0升级到条令2.1(或2.2)时,我遇到了一个类似的问题(尽管相反)。对于Doctrine 2.0,我使用@Table的注释运行良好,但升级后,它开始抱怨注释未加载。我建议您尝试一下条令2.2,以便使用@ORM\Table注意到一个小差异
在你的实体中,你的使用
use Doctrine\Mapping as ORM;
而不是:
use Doctrine\ORM\Mapping as ORM;
也许这会解决问题?正如Gohn67所说。。你必须举例说明一个新的读者
我和Zend也有同样的问题。
问题出在读卡器上,而不是驱动程序上
例:
如果我使用“条令\Common\Annotations\SimpleAnnotationReader”作为读卡器,我必须在没有@ORM的情况下编写所有注释
但是如果我使用“条令\Common\Annotations\AnnotationReader”,我需要在注释上加上@ORM以获得工作我的问题是bootstrap.php(cli config.php需要)
此“src”未指向正确的源文件夹。[英文]
查看bootstrap.php文件,在配置orm原则的地方,通过yaml更改注释:
/* Configuring by annotacions*/
//$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);
注意:路径/config/yml必须存在
[西班牙文]
修订《建筑引导法》和《结构主义》,柬埔寨:
/*通过注释进行配置*/
//$config=Setup::createAnnotationMetadataConfiguration(数组(DIR/src”),$isDevMode)
重要事项:el directorio/config/yml debe existir。我遇到了与您相同的问题。我使用的是教义2.4。我可以通过在配置文件中执行此操作来修复此问题。我不确定这是否适用于<2.3版本
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/entities"), $isDevMode, null, null, FALSE); // just add null, null, false at the end
下面是createAnnotationMetadataConfiguration方法的文档。我刚刚深入研究了源代码。默认情况下,它使用一个简单的注释读取器,这意味着您不需要在注释前面有ORM\,您可以使用@Entities而不是@ORM\ Entities。所以,您在这里需要做的就是使用简单的注释读取器禁用它
/**
* Creates a configuration with an annotation metadata driver.
*
* @param array $paths
* @param boolean $isDevMode
* @param string $proxyDir
* @param Cache $cache
* @param bool $useSimpleAnnotationReader
*
* @return Configuration
*/
public static function createAnnotationMetadataConfiguration(array $paths, $isDevMode = false, $proxyDir = null, Cache $cache = null, $useSimpleAnnotationReader = true)
。。
$generator=新实体generator();
$generator->setAnnotationPrefix(“”);//编辑:无需处理元数据类的快速修复
$generator->setUpdateEntityIfExists(true);//仅在类已存在时更新
//$generator->SetRegeneratEntityIfExists(true);//这将覆盖现有的类
$generator->setGenerateStubMethods(true);
$generator->setAnnotationPrefix('ORM\\');//生成($metadata,_DIR__.'/Entities');
..
我刚才也遇到了同样的问题。如果我能找到解决方案,我会发布答案。发布实体和读取器的代码以及目录结构可能有助于获得准确的答案。添加了用于cli配置和用户的sourcec代码。phpwow@450 reps bounty:o,希望我知道足够的原则来帮助您:(我不知道为什么,但是名称空间被写入了文档中。我认为文档不是最新的(这很令人沮丧)。你是个救命稻草。我使用了一个旧的Symfony项目直接从数据库表生成实体映射,并将实体类复制到这个新的项目中。你的ans
/* Configuring by annotacions*/
//$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);
/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/entities"), $isDevMode, null, null, FALSE); // just add null, null, false at the end
/**
* Creates a configuration with an annotation metadata driver.
*
* @param array $paths
* @param boolean $isDevMode
* @param string $proxyDir
* @param Cache $cache
* @param bool $useSimpleAnnotationReader
*
* @return Configuration
*/
public static function createAnnotationMetadataConfiguration(array $paths, $isDevMode = false, $proxyDir = null, Cache $cache = null, $useSimpleAnnotationReader = true)
..
$generator = new EntityGenerator();
$generator->setAnnotationPrefix(''); // edit: quick fix for No Metadata Classes to process
$generator->setUpdateEntityIfExists(true); // only update if class already exists
//$generator->setRegenerateEntityIfExists(true); // this will overwrite the existing classes
$generator->setGenerateStubMethods(true);
$generator->setAnnotationPrefix('ORM\\'); // <<---------------|
$generator->setGenerateAnnotations(true);
$generator->generate($metadata, __DIR__ . '/Entities');
..