1

私は実体を生成するための最良の方法を見つけようとしています。これが私が現在行っていることです。

次のように、マッパーとハイドレーターを使用してエンティティを作成します。

namespace Event\Model\Mapper;

use ZfcBase\Mapper\AbstractDbMapper;

class Event extends AbstractDbMapper
{
    protected $tableName  = 'events';

    public function findEventById($id)
    {
       $id = (int) $id;

       $select = $this->getSelect($this->tableName)
                      ->where(array('event_index' => $id));

       $eventEntity = $this->select($select)->current();  

     if($eventEntity){

        //Set Location Object
        $locationMapper = $this->getServiceLocator()->get('location_mapper');       
        $locationEntity = $locationMapper->findlocationById($eventEntity->getLocationIndex());          
        $eventEntity->setLocationIndex($locationEntity);

        //Set User Object
        $userMapper = $this->getServiceLocator()->get('user_mapper');
        $userEntity = $userMapper->findUserById($eventEntity->getEnteredBy());
        $eventEntity->setEnteredBy($userEntity);

        //Set Catalog Object
        $catalogMapper = $this->getServiceLocator()->get('catalog_mapper');
        $catalogEntity = $catalogMapper->findCatalogById($eventEntity->getCatalogIndex());
        $eventEntity->setCatalogIndex($catalogEntity);          
    }


    return $eventEntity;
   }
}

このアプローチの問題は、ユーザーエンティティを呼び出すと、このエンティティに他のエンティティがアタッチされているため、ユーザーエンティティを挿入してイベントエンティティを生成すると、イベントエンティティが非常に大きくなり、かさばることになります。 「老年学ツリー」の最初のレイヤーが必要です。

そこで、イベントエンティティの子エンティティをバインドできるEventEntityFactoryを作成することを考えていました。そのために、ファクトリを作成することを計画していました。

これを行うためのより良い方法はありますか?

ありがとう

4

1 に答える 1

1

1つのアプローチは、仮想プロキシ(遅延読み込みあり)を使用することです。

http://phpmaster.com/intro-to-virtual-proxies-1/

http://phpmaster.com/intro-to-virtual-proxies-2/

基本的に、エンティティを生成し、関連するエンティティを軽量のプロキシオブジェクトに置き換えます。このオブジェクトは、遅延読み込みで必要な場合にのみ、関連するエンティティを読み込みます。

私はこのアプローチをDatamapperデザインパターンと一緒に何度も使用しましたが、非常にうまく機能します。

于 2013-01-22T12:24:21.550 に答える