12

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注釈に対してそれを行う必要があります。自動的に認識されるのではなく、各注釈クラスを明示的に指定する必要がある理由を理解しようとしています (その名前空間内のすべてのクラスへのアクセスを許可してはいけませんか?)。useuse 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 の両方が機能するソリューションを見つけたいだけです。何か案は?

4

8 に答える 8

24

Silex、Doctrine2、および Symfony-Validator を使用しているときに、同様の問題が発生しました。

解決策は、 SimpleAnnotationsReader の使用を避け、代わりに通常の AnnotationReader を使用することでした ( Doctrine\ORM\Configuration::newDefaultAnnotationDriverを見てください)。次に、すべてのエンティティの前に を付けますORM\(もちろん、すべてのエンティティに挿入use Doctrine\ORM\Mapping as ORM;します)。

于 2012-11-15T00:06:28.727 に答える
14

エンティティ ファイルに以下を追加して、この問題を解決しました。

use Doctrine\ORM\Mapping as ORM;

したがって、私のファイルは次のようになります。

<?php

namespace Acme\CustomBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Example
 *
 * @ORM\Entity
 * @ORM\Table(name="example")
 *
 */
class Example
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @var integer
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=125)
     *
     * @var string
     */
    private $title;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set title
     *
     * @param string $title
     *
     * @return Example
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string
     */
    public function gettitle()
    {
        return $this->title;
    }

}
于 2015-11-24T11:08:07.590 に答える
5

useで使用したすべての注釈にステートメントを追加しますentities。例えば:

use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\Table;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\GeneratedValue;

しかし、この方法を使用するのは面白くないかもしれません。すべてのuseステートメントを 1 つのファイルに書き込んで、entities.

于 2015-02-04T11:50:04.983 に答える
0

ubuntuの更新中にphp7がphp8にアップグレードされたときに同じ問題が発生しました。プロジェクトのすべての依存関係を php8 に更新したくなかったので、代わりに ondrej/php ppa をインストールし、php8 に加えて php7 を再インストールしました。

于 2022-03-04T16:44:49.203 に答える
0

醜い解決策

私はドクトリンを学んでおり、この段階で私にとって重要なのは、ウェブサイトから例を簡単にコピー/貼り付けして、追加の編集なしで使用できることです.

  • すべてのエンティティに対して、次のように名前空間を設定します。namespace Doctrine\ORM\Mapping;
于 2021-02-05T17:54:17.153 に答える