2012-02-27 6 views
3

は、私が、私はその前に私が決める、http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/ OKチュートリアルを使用して、教義2を統合し、その後、ロン・アレンのチュートリアルhttp://akrabat.com/getting-started-with-zend-framework-2/ で開始しましたそれをより複雑にする。Zend Frameworkに2つのモデルが、私はその2. を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(); 
    } 

    ... 
} 

しかし、それはdoesnの仕事!

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

だから私の質問は次のとおりです:何が問題なのである 私はこのmensageを得ましたか。私の団体は間違った場所にいる?または私のモジュール構成は大丈夫ではありませんか? 複数のモジュールで1つのエンティティを表示させるにはどうすればよいですか?

UPDATE:

私は私のエンティティを変更します。

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'." 

UPDATE 2:

私は変更をその自分のアプリケーションの構造:

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

ので、私のエンティティが同じ名前空間にあり、今私のプログラムは、それが働いています! =)

しかし、私はまだ質問があります.ZF2の複数のモジュールに1つのエンティティを表示させるにはどうすればよいですか?

+0

あなたがそれが働いているのを見てうれしい。 Doctrine 2は実体が同じディレクトリに存在するのが本当に好きです。 Symfony 2には複数のディレクトリを許可するためのラッパーコードがありますが、詳細は見たことがありません。 ZF2が実際にリリースされ、より多くの人がZF2を使用し始めるまで、あなたは少なくとも自分でいるかもしれません。 – Cerad

+0

ええ、それはZF2の質問のみだと思います...しかし、誰も私の質問に答えることはできません。あなたが 'albumモジュール'(selectOneとselectAllだけ)と 'adminモジュール'(selectOne 、selectAll、insert、update、delete)、エンティティの整理方法は?それは私の質問です...しかし、あなたの助けのために大変ありがとうございます@セラード! – vinigarcia87

答えて

2

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

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

は、私は、彼らが次のコードを挿入し、ファイルモジュール/アルバム/設定/ module.config.phpでドクトリン2 で動作するようにモジュールを構成する方法を教え、私はチュートリアルhttp://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/

を再生し、言ったように:

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' 
          ), 
         ), 
        ), 
       ), 
      ), 

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

"This tells Doctrine that the Album module’s entities use the namespace Album\Entity, and that the classes in that namespace are stored in $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' 
     ), 
    ), 
//... 

あなたは私がきちんと「アーティスト」ドライバ...

今私のアプリケーション作業を設定見ることができるように! =)

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

皆様ありがとうございます! :)

0

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

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

が必要です。免責事項:私はZF2を使用していません。私はあなたのクラスローダーパスがすべてセットアップされていると仮定しています。あなたの更新の質問について

+0

ええ、nice。私はそれを試みます。その正しい私のモデルをこのように保つ?あるいは、私はすべて同じ名前空間に入れようとしていますか?私はそこにすべてのエンティティがあるならば、私はディレクトリ 'モデル'を持っている必要がありますか? – vinigarcia87

+0

が機能しませんでした。 ===同じ問題が再び起きる... – vinigarcia87

+0

Symfony 2は名前空間などのところまでもう少し成熟していますが、ドキュメントを参照して物事を整理する方法がわかりますが、Doctrineは実際には、 – Cerad

1

あなたのエンティティと一つのモジュールで使用される他のすべてのコードがちょうど

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

またはあなたが必要があるかもしれません何を経由して、それをインスタンス化し、お互いのモジュール内の「可視」です。 すべてのモジュールがアプリケーション設定に登録されていることを確認してください。

+0

Uhm、それはいいですが、なぜですか?私の教義は機能しませんか?それはエラーメッセージを表示し続けます... – vinigarcia87

+0

あなたの質問の最後の行はエラーがないことを示唆しています。 –

関連する問題