Php 原则2-orm不处理元数据类:生成存储库

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

我正在尝试生成实体存储库并获得这样的消息

没有要处理的元数据类

我已经查到了这种用法

使用条令\ORM\Mapping作为ORM; 及 @ORM\Table 它不能正常工作

如果我将所有@ORM\Table更改为仅@Table(和其他注释),它将开始工作,但我真的不想这样做,因为它应该与@ORM注释一起工作

我按照下面一页的指示做,但运气不好。我知道我很接近,但缺少文件路径或名称空间。请帮忙

有人有这样的问题吗?我错过了什么

cli配置

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

..