我正在尝试生成实体存储库并获取此类消息
无要处理的元数据类
我跟踪了
的使用情况将Doctrine \ ORM \ Mapping用作ORM; 和 @ORM \表 工作不正常。
如果我将所有@ORM \ Table更改为@Table(和其他注释) - 它开始工作,但我真的不想这样,因为它应该与@ORM注释一起使用。
我按照下面的说明操作,没有运气。我知道我很接近但遗漏了文件路径或名称空间。请帮忙。
http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html
有没有人有这样的问题?我错过了什么?
cli-config,
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)
));
User.php(工作版本,最初是如上所述,@ Table是@ORM \ Table和其他注释类似@ORM \ part就像@ORM \ Column等)
<?php
namespace Entities;
use Doctrine\Mapping as ORM;
/**
* User
*
* @Table(name="user")
* @Entity(repositoryClass="Repository\User")
*/
class User
{
/**
* @var integer $id
*
* @Column(name="id", type="integer", nullable=false)
* @Id
* @GeneratedValue
*/
private $id;
/**
* @var string $userName
*
* @Column(name="userName", type="string", length=45, nullable=false)
*/
private $userName;
/**
* @var string $email
*
* @Column(name="email", type="string", length=45, nullable=false)
*/
private $email;
/**
* @var text $bio
*
* @Column(name="bio", type="text", nullable=true)
*/
private $bio;
public function __construct()
{
}
}
答案 0 :(得分:19)
编辑3:
如果重要,我使用的是Doctrine 2.2.1。无论如何,我只是在这个主题上添加更多信息。
我在Doctrine \ Configuration.php类中挖掘了一下newDefaultAnnotationDriver如何创建AnnotationDriver。该方法从第125行开始,但如果您使用最新版本的公共库,则相关部分为第145至147行。
} else {
$reader = new AnnotationReader();
$reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
}
我实际上无法在AnnotationReader类中找到setDefaultAnnotationNamespace方法。所以这很奇怪。但我假设它设置了名称空间Doctrine \ Orm \ Mapping,因此该命名空间中的注释不需要加前缀。因此,错误似乎是学说cli工具以不同方式生成实体。我不确定为什么会这样。
您在下面的回答中注意到,我没有调用setDefaultAnnotationNamespace方法。
一个附注,我在您的用户实体课程中注意到您有use Doctrine\Mapping as ORM
。生成的文件不应该创建use Doctrine\Orm\Mapping as ORM;
吗?或者这可能是一个错字。
编辑1: 好的,我发现了问题。显然它与\ Doctrine \ ORM \ Configuration类使用的默认注释驱动程序有关。
因此,您需要实例化一个新的AnnotationReader,一个新的AnnotationDriver,然后在Configuration类中设置它,而不是使用$config->newDefaultAnnotationDriver(...)
。
示例:
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中):
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
require_once 'Doctrine/Common/ClassLoader.php';
define('APPLICATION_ENV', "development");
error_reporting(E_ALL);
$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"));
//Here is the part that needs to be adjusted to make allow the ORM namespace in the annotation be recognized
#$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__ . "/application/persistent/Entities"));
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);
//End of Changes
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)
));
答案 1 :(得分:9)
我遇到了你遇到的同样问题。我正在使用Doctrine 2.4。我可以通过在配置文件中执行此操作来解决此问题。我不确定这是否适用于版本&lt; 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)
答案 2 :(得分:1)
正如Gohn67所说的那样......你必须设立一个新的读者。
我和Zend有同样的问题。 问题在于读者而不是驱动程序。
例: 如果我使用“Doctrine \ Common \ Annotations \ SimpleAnnotationReader”作为读者,我必须在没有@ORM
的情况下编写所有注释但如果我使用“Doctrine \ Common \ Annotations \ AnnotationReader”,我需要将@ORM放在注释上才能开始工作
答案 3 :(得分:0)
除了在Symfony2项目中,我找不到@ORM\Table
的任何引用。在文档中,它始终被引用为@Table
我知道它在sf2中工作(我在那里使用它)。是否可能是Doctrine安装了vanilla的错误?
答案 4 :(得分:0)
正如您所说,最可能的解释是,在读者或实体中包含(名称空间问题,路径问题等)存在问题。
答案 5 :(得分:0)
当从Doctrine 2.0升级到Doctrine 2.1(或2.2)时,我遇到了类似的问题(虽然反过来说)。对于Doctrine 2.0,我使用@Table的注释工作正常,但升级后它开始抱怨没有加载注释。我建议你给Doctrine 2.2一个go,以便使用@ORM \ Table
答案 6 :(得分:0)
注意到一个小小的差异......
在您的实体中使用;
use Doctrine\Mapping as ORM;
而不是:
use Doctrine\ORM\Mapping as ORM;
也许这会解决它?
答案 7 :(得分:0)
我的问题出在bootstrap.php(cli-config.php所需)
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
这个“src”没有指向正确的源文件夹。
答案 8 :(得分:0)
[英国]
查看 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必须存在。
[Espanish]
Revisar el archivo bootstrap y donde configuras el orm doctrine,cambia las anotaciones por yaml:
/ *通过annotacions进行配置* / // $ config = Setup :: createAnnotationMetadataConfiguration(array( DIR 。“/ src”),$ isDevMode);
/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);
Importante:el directorio / config / yml debe existir。
答案 9 :(得分:0)
..
$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');
..