0

それぞれが独自のデータベースを持つ2つのモジュールを含むZF2アプリケーションでDoctrine2を使用しようとしています。あるモジュールのエンティティを別のモジュールのエンティティに関連付けることができるように、データベース間結合を使用する必要があります。これがセットアップのUML図です。

私はこれを最初のエンティティで使用してみました(無関係なパラメーターとuseステートメントを削除しました):

namespace Client\Entity;

/**
 * A website.
 *
 * @ORM\Entity
 * @ORM\Table(name="users.website")
 * ...
 * @property $server
 */
class Website extends BaseEntity {

    // Other class vars ... 

    /**
     * @ORM\ManyToOne(targetEntity="Server\Entity\Server", inversedBy="websites")
     * @ORM\JoinColumn(name="server_id", referencedColumnName="id")
     */
    protected $server;

そしてこれは私のサーバーエンティティで:

namespace Server\Entity;

/**
 * A server.
 *
 * @ORM\Entity
 * @ORM\Table(name="servers.server")
 * ...
 * @property $websites
 */
class Server extends BaseEntity {

   // Other class vars ... 

   /**
    * @ORM\OneToMany(targetEntity="Client\Entity\Website", mappedBy="server")
    */
   protected $websites;

DoctrineModule\Form\Element\ObjectSelectこのマッピングは、(サーバーの関連付けに使用するWebフォームを介して)新しいWebサイトエンティティを作成するときに完全に機能しますが、既存のWebサイトを編集しようとすると、次のReflectionExceptionがスローされます。

クラスServer\Entity\Websiteが存在しません

完全なスタックトレースはここにあります。何らかの理由で、サーバーエンティティがWebサイトエンティティとの関連付けからアクセスされると、すべてのエンティティがではServer\Entityなく名前空間に存在すると見なされますClient\Entity。サーバーエンティティが正しいモジュール名前空間にあることを確認するには、何をする必要がありますか?

CLIコマンドorm:infoは以下を生成します。

Found 7 mapped entities:
[OK]   Server\Entity\Server
[OK]   Client\Entity\Role
[OK]   Client\Entity\Website
[OK]   Client\Entity\User
[OK]   Client\Entity\Client
[OK]   Client\Entity\Permission
[OK]   Message\Entity\Notification

しかし、orm:validate-schema結果は次のようになります。

[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

私は私のモジュールのそれぞれにこれを持っていますmodule.config.php

'driver' => array(
    __NAMESPACE__ . '_driver' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
    ),
    'orm_default' => array(
        'drivers' => array(
            __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
        )
    )
)
4

1 に答える 1

3

私はなんとかそれを修正することができました。私のServer\Entity\Server場合、Webサイトを追加/削除するためのゲッター/セッター関数がありました。

public function setWebsite(Website $website) 
{
   $this->websites->add($website);    
}

public function removeWebsite(Website $website)
{
   $this->websites->removeElement($website);
}

ただし、引数として完全な名前空間を指定する必要があります。

public function setWebsite(\Client\Entity\Website $website) { ... }

そのような愚かな間違い!スタックトレース内のすべてのファイルをトロールし、Entityクラスのすべてのメソッド/引数をプロキシファイルに保存しようとしたところ(Doctrine / ORM / Proxy / ProxyFactoryの223行目)に到達したため、問題が見つかりました。 php)。

于 2013-02-22T10:31:43.387 に答える