エンティティリポジトリを生成しようとしていますが、そのようなメッセージが表示されます
処理するメタデータクラスがありません
私はその使用を追跡しました
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()
{
}
}
編集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)
));
_
私はあなたが持っているのと同じ問題に遭遇しました。私は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)
Gohn67が言ったように..あなたは新しい読者をインスタンス化する必要があります。
私は同じ問題を抱えていましたが、Zendに問題がありました。問題は、ドライバーではなくリーダーにあります。
例:リーダーとして「Doctrine\Common\Annotations\SimpleAnnotationReader」を使用する場合、@ ORMなしですべてのアノテーションを作成する必要がありました
しかし、「Doctrine\Common\Annotations\AnnotationReader」を使用する場合は、作業を行うためにアノテーションに@ORMを付ける必要があります
最も可能性のある説明は、あなたが述べたように、リーダーまたはエンティティのいずれかでinclude(名前空間の問題、パスの問題など)に問題があることです。
Doctrine 2.0からDoctrine 2.1(または2.2)にアップグレードするときに(逆ですが)同様の問題が発生しました。Doctrine 2.0 @Tableを使用したアノテーションは正常に機能しましたが、アップグレード後、アノテーションがロードされていないと文句を言い始めました。@を使用するには、Doctrine 2.2を試してみることをお勧めします。 ORM\Table
[英語]
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。
@ORM\Table
への参照は、Symfony2プロジェクト以外には見つかりません。ドキュメントでは、常に@Table
として参照されています
私はそれがsf2で動作することを知っています(私はそこでそれを使用しています)。 DoctrineからのVanillaインストールのバグである可能性はありますか?
私の問題はbootstrap.php(cli-config.phpで必要)にありました
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode);
この「src」は正しいソースフォルダを指していませんでした。
..
$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');
..
小さな不一致に気づきました...
あなたのエンティティであなたが使用している;
use Doctrine\Mapping as ORM;
の代わりに:
use Doctrine\ORM\Mapping as ORM;
多分それはそれを修正しますか?