web-dev-qa-db-ja.com

Doctrine 2-orm:generate-repositoriesで処理するメタデータクラスはありません

エンティティリポジトリを生成しようとしていますが、そのようなメッセージが表示されます

処理するメタデータクラスがありません

私はその使用を追跡しました

doctrine\ORM\MappingをORMとして使用します。 @ ORM\Tableが正しく機能していません。

すべての@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\Columnなどの@ORM \部分がありました)

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

    }

}
19
waney

編集3:

重要な場合は、Doctrine 2.2.1を使用しています。とにかく、このトピックについてもう少し情報を追加しています。

Doctrine\Configuration.phpクラスを調べて、newDefaultAnnotationDriverがどのようにAnnotationDriverを作成したかを確認しました。メソッドは125行目から始まりますが、最新バージョンのCommonライブラリーを使用している場合、関連する部分は145行目から147行目です。

_} else {
    $reader = new AnnotationReader();
    $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
}
_

AnnotationReaderクラスでsetDefaultAnnotationNamespaceメソッドを実際に見つけることができませんでした。だからそれは奇妙だった。ただし、名前空間Doctrine\Orm\Mappingが設定されていると想定しているため、その名前空間の注釈にプレフィックスを付ける必要はありません。したがって、doctrine cliツールはエンティティを異なる方法で生成するように見えるため、エラーが発生します。その理由はわかりません。

以下の私の答えで、setDefaultAnnotationNamespaceメソッドを呼び出さなかったことがわかります。

ちなみに、ユーザーエンティティクラスで_use Doctrine\Mapping as ORM_があることに気づきました。生成されたファイルは_use Doctrine\Orm\Mapping as ORM;_を作成するべきではありませんか?または多分それはタイプミスです。

編集1:わかりました、問題が見つかりました。どうやらそれは\ Doctrine\ORM\Configurationクラスによって使用されるデフォルトのアノテーションドライバーと関係があります。

したがって、$config->newDefaultAnnotationDriver(...)を使用する代わりに、新しいAnnotationReader、新しいAnnotationDriverをインスタンス化してから、それをConfigurationクラスに設定する必要があります。

例:

_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)
));
_
19
Gohn67

私はあなたが持っているのと同じ問題に遭遇しました。私はDoctrine 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 \を付ける必要はなく、@ ORM\Entitiesの代わりに@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)
10
Zorji

Gohn67が言ったように..あなたは新しい読者をインスタンス化する必要があります。

私は同じ問題を抱えていましたが、Zendに問題がありました。問題は、ドライバーではなくリーダーにあります。

例:リーダーとして「Doctrine\Common\Annotations\SimpleAnnotationReader」を使用する場合、@ ORMなしですべてのアノテーションを作成する必要がありました

しかし、「Doctrine\Common\Annotations\AnnotationReader」を使用する場合は、作業を行うためにアノテーションに@ORMを付ける必要があります

1
Quaid

最も可能性のある説明は、あなたが述べたように、リーダーまたはエンティティのいずれかでinclude(名前空間の問題、パスの問題など)に問題があることです。

0
Hakan Deryal

Doctrine 2.0からDoctrine 2.1(または2.2)にアップグレードするときに(逆ですが)同様の問題が発生しました。Doctrine 2.0 @Tableを使用したアノテーションは正常に機能しましたが、アップグレード後、アノテーションがロードされていないと文句を言い始めました。@を使用するには、Doctrine 2.2を試してみることをお勧めします。 ORM\Table

0
Jon Skarpeteig

[英語]

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が存在する必要があります。

[スペイン語]

Revisar el archivo bootstrap y donde configuras el orm doctrine、cambia las anotaciones por yaml:

/ *注釈による構成*/// $ config = Setup :: createAnnotationMetadataConfiguration(array([〜#〜] dir [〜#〜]。 "/ src")、$ isDevMode);

/* Configuring by yaml*/
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yml"), $isDevMode);

重要:eldirectorio/config/ymldebeexistir。

0
Luillyfe

@ORM\Tableへの参照は、Symfony2プロジェクト以外には見つかりません。ドキュメントでは、常に@Tableとして参照されています

私はそれがsf2で動作することを知っています(私はそこでそれを使用しています)。 DoctrineからのVanillaインストールのバグである可能性はありますか?

0
SkaveRat

私の問題はbootstrap.php(cli-config.phpで必要)にありました

$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);

この「src」は正しいソースフォルダを指していませんでした。

0
alvaro
..

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

..
0
Max

小さな不一致に気づきました...

あなたのエンティティであなたが使用している;

use Doctrine\Mapping as ORM;

の代わりに:

use Doctrine\ORM\Mapping as ORM;

多分それはそれを修正しますか?

0
Lee Davis