Doctrine 2 - 没有元数据类由orm:generate-repositories处理

时间:2012-03-18 02:30:01

标签: php orm doctrine-orm

我正在尝试生成实体存储库并获取此类消息

无要处理的元数据类

我跟踪了

的使用情况

将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()
    {

    }

}

10 个答案:

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

..