0

エンティティから依存/親オブジェクトを取得するにはどうすればよいでしょうか。

$person->getAddress();

これにより、データベースからその人物の Address オブジェクトが取得され、オブジェクトとして返されます。これはそれを行う良い方法であり、これが問題ない場合、コードはどのように見えるべきですか.

これを行うことは、アドレスが関連するエンティティ/値オブジェクトであることをオブジェクト自体が認識する必要があることを意味します。この種の構文が必要な理由は、プレゼンテーション層できれいに見えるからです。

person クラスは次のようになります。

class Person {
  protected $_domain = null; // domain is assigned when instantiated
  protected $_data = array('name', 'address');
  protected $_relations = array(
    'address'=>array(
      'class'=>'Address'
    )
  );
  protected $_retrievedRelations = array();
  public function getAddress() {
    if (array_key_exists('address', $this->_relations) ) {
      if (!array_key_exists('address', $this->_retrievedRelations) ) {
        $this->_retrievedRelations['address'] = $this->_domain->getAddress($this->_data['address']);
      }

      return $this->_retrievedRelations['address'];
    }

    return $this->_data['address'];
  }
}

では、getAddress メソッド内で $domain オブジェクトを使用し、関係情報を Person クラスに保持しても問題ないでしょうか?

私は答えをずっと探していたので、答えてください。

4

2 に答える 2

3

Zend_Db_Table Relationshipsを見てください。それらはまさにそれを可能にし、さらに多くのことを可能にします。独自の実装を考え出す代わりに、Zend_Db_Table todayを使用するか、Zend Framework のコードを調べて、質問に対する設計上の決定を下すことができます。かなり有力な情報源です。

于 2009-12-28T15:31:33.907 に答える
2

第一に、質問のタイトルはあまり明確ではないと思います。第二に、何が質問されているのか完全にはわかりません...私の意見では、タイトルと投稿の両方を編集して、少しきれいにする必要があります。

投稿には5つの質問が含まれているようです(言い換えれば):

  1. エンティティから依存/親オブジェクトを取得するにはどうすればよいですか?
  2. $person->getAddress()データベースから個人のAddressオブジェクトを取得する良い方法はありますか?
  3. これがそれを行うための良い方法である場合、コードはどのようになりますか?
  4. getAddressメソッド内で$domainオブジェクトを使用しても大丈夫ですか?
  5. Personクラスに関係情報を保持しても大丈夫ですか?

答えが行く限り:

  1. この場合$person->getAddress()、良い選択のようです、あなたが知っている、素晴らしくて説明的です。;-)
  2. 問題はありません。個人には住所があります。その住所を取得するには、個人のオブジェクトに要求します。
  3. 少し雑然としていますが、与えられたコード例はこれに答えているようです。アドレスをメンバーオブジェクトにしただけですが、それ以外はほとんど同じです
  4. &5。私は、主に好み、優先順位、デザイン依存性の問題だと思います。これに対する明確な答えは本当にありません。また、ここでセマンティクスについて議論しているのでしょうか、それとも実際のシナリオで議論しているのでしょうか。

回答Nr.3に沿ったいくつかのコード:(リスト内で正しく機能させることができませんでした)

class Person {
    protected $_domain = null; // domain is assigned when instantiated
    protected $_address;        // object

    public function getAddress() {
        if (!isset($this->_address) ) {
            $this->_address = $this->_domain->getAddressForPerson($this); // assuming $this contains some sort of ID
        }
        return $this->_address;
    }
}
于 2009-12-26T14:11:06.060 に答える