3

Zend Framework 2 を理解しようとしています。そのために、Ron Allen のチュートリアル http://akrabat.com/getting-started-with-zend-framework-2/ から始めまし://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/ わかり ました、その前にもっと複雑にすることにしました。

データベースを次のように変更します。

--
-- Estrutura da tabela `album`
--
CREATE TABLE IF NOT EXISTS `album` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `artist_id` int(11) NOT NULL,
  `title` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `artist` (`artist_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

--
-- Estrutura da tabela `artist`
--
CREATE TABLE IF NOT EXISTS `artist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

私のアプリケーションはこの構造を持っています:

module
    Album
        src
            Album
                Controller
                    AlbumController.php
                Entity
                    Album.php
    Artist
        src
            Artist
                Controller
                    ArtistController.php
                Entity
                    Artist.php

私の新しいエンティティはそのようなものです:

class Album {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\ManyToOne(targetEntity="Artist", inversedBy="album")
     * @ORM\JoinColumn(name="artist_id", referencedColumnName="id")
     */
    protected $artist;

    ...
}
class Artist {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="Album", mappedBy="artist")
     */
    protected $album;


    public function __construct()
    {
        $this->album = new ArrayCollection();
    }

    ...
}

しかし、うまくいきません!私はこのメッセージを得ました:

"The target-entity Album\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."

だから私の質問は:何が間違っているのですか?エンティティが間違った場所にありますか? または私のモジュール構成は大丈夫ではありませんか?複数のモジュールで 1 つのエンティティを表示するにはどうすればよいですか?

アップデート:

エンティティを次のように変更します。

class Album {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")
     * @ORM\JoinColumn(name="artist_id", referencedColumnName="id")
     */
    protected $artist;

    ...
}
class Artist {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="\Album\Entity\Album", mappedBy="artist")
     */
    protected $album;

    ...
}

しかし、同じエラーが発生しました:

"The target-entity Artist\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."

更新 2:

アプリケーションの構造を次のように変更しました。

module
    Album
        src
            Album
                Controller
                    AlbumController.php
                    ArtistController.php
                Entity
                    Album.php
                    Artist.php

私のエンティティは同じ名前空間にあり、私のプログラムは機能しています! =)

しかし、まだ疑問があります: ZF2 で 1 つのエンティティを複数のモジュールから見えるようにするにはどうすればよいですか?

4

3 に答える 3

2

答えが見つかりました!=D

自分の質問に答えるのに8時間待たなければならなかったので、ここに行きます。

私が言ったように、私はチュートリアルhttp://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/を再現します

彼らは Doctrine 2 で動作するようにモジュールを構成する方法を教えています。 ファイル module/Album/config/module.config.php に、次のコードを挿入します。

return array(
    'di' => array(
        'instance' => array(
            // ...
            'orm_driver_chain' => array(
                'parameters' => array(
                    'drivers' => array(
                        'Album' => array(
                            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                            'namespace' => __NAMESPACE__ . '\Entity',
                            'paths' => array(
                                __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'
                            ),
                        ),
                    ),
                ),
            ),

チュートリアルによると:

「これは、Doctrine に Album モジュールのエンティティが名前空間 Album\Entity を使用し、その名前空間のクラスが $PROJECT_DIR/module/Album/src/Album/Entity に格納されていることを伝えます。」

だから、問題があります!Doctrine は Album\Entity のみを使用するように構成されました! だから私はコードを次のように変更しました(プログラミングが悪い...申し訳ありません):

//...
'drivers' => array(
    'Album' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'namespace' => __NAMESPACE__ . '\Entity',
        'paths' => array(
            __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'
        ),
    ),
    'Artist' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'namespace' => '\Artist\Entity',
        'paths' => array(
            __DIR__ . '/../../Artist/src/Artist/Entity'
        ),
    ),
//...

ご覧のとおり、「Artist」ドライバーを構成しています...

今、私のアプリケーションは正しく動作します! =)

アプリケーションでドクトリンを構成する正しい方法をまだ探していますが、少なくとも答えは得られました!

みんなありがとう!:)

于 2012-02-28T11:36:25.707 に答える
1

更新された質問について:

エンティティと、1 つのモジュールで使用される他のすべてのコードは、他の各モジュール内で「表示」されます。

$artist = new \Album\Entity\Artist();

または必要なものは何でも。すべてのモジュールがアプリケーション構成に登録されていることを確認してください。

于 2012-02-27T18:56:14.223 に答える
0

デフォルトでは、Doctrine 2 は関連エンティティの現在のエンティティと同じ名前空間を検索します。何かのようなもの:

 * @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")

必要になります。免責事項: ZF2 は使用していません。クラスローダーのパスがすべて設定されていると想定しています。

于 2012-02-27T16:29:11.657 に答える