Doctrine2 と Symfony2 Validator コンポーネントを使用している CodeIgniter プロジェクトに取り組んでいます。
すべての Doctrine2 エンティティuse Doctrine\ORM\Mapping
とエンティティ マネージャはそれらを認識します。私のエンティティ注釈は次のようになります。
/**
* @Entity(repositoryClass = "UserRepository")
* @Table(name = "user")
* @HasLifecycleCallbacks()
*/
この時点で、問題なくエンティティを永続化できます。最初の問題は、Symfony2 Validator コンポーネントを使用しようとしたときに発生します。User
オブジェクトを検証しようとすると、次のエラーが発生します。
[セマンティカル エラー] クラス Entity\User の注釈 "@Entity" はインポートされませんでした。この注釈に「use」ステートメントを追加するのを忘れたのではないでしょうか?
この問題の唯一の「修正」は を使用することですが、エンティティ (テーブル、列、ManyToOne など) で使用されているすべてのuse Doctrine\Mapping\Entity
注釈に対してそれを行う必要があります。自動的に認識されるのではなく、各注釈クラスを明示的に指定する必要がある理由を理解しようとしています (その名前空間内のすべてのクラスへのアクセスを許可してはいけませんか?)。use
use Doctrine\ORM\Mapping
そのため、use Doctrine\ORM\Mapping as ORM
すべての注釈の前にORM\
. 例: @ORM\Entity()
. Symfony2 バリデーターは不平を言うのをやめましたが、Doctrine2 は、Class Entity\User is not a valid entity or mapped super class.
なぜこのメソッドがバリデーターでは機能するのに Doctrine2 では機能しないのか、私にはわからないと不平を言っています。コンソール コマンドを実行するdoctrine:orm:info
と、User
エンティティが認識されません。
これは CodeIgniter アプリであるため、Symfony2 および Doctrine2 ライブラリを自動ロードしています。私のオートロードコードは次のとおりです。
# Symfony2 ClassLoader component
require_once __DIR__ . '/application/libraries/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
$loader = new \Symfony\Component\ClassLoader\UniversalClassLoader();
$loader->register();
$loader->registerNamespace('Symfony', __DIR__ . '/application/libraries/symfony/src');
$loader->registerNamespace('Doctrine', __DIR__ . '/application/libraries/doctrine/lib');
# Doctrine2
require_once __DIR__ . '/application/libraries/doctrine/lib/Doctrine/Common/Annotations/AnnotationRegistry.php';
use Doctrine\Common\Annotations\AnnotationRegistry;
AnnotationRegistry::registerLoader(function($class) use ($loader) {
$loader->loadClass($class);
$classExists = class_exists($class, false);
return $classExists;
});
AnnotationRegistry::registerFile(__DIR__ . '/application/libraries/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
すべてを前置きする必要があるかどうかは気にしませんORM\
。Symfony2 Validator と Doctrine2 の両方が機能するソリューションを見つけたいだけです。何か案は?