2

私はRowGateway自分のエンティティにクラスを実装しようとしています。エンティティを操作するフォームが既にあり、ハイドレーターを操作するように設定しようとしていClassMethodsます。

また、ハイドレーターがメソッド orをArraySerializable呼び出し、このメソッドが行を編集するときに適切な主キーを設定することにも気付きましたが、残念ながらハイドレーターはそれを行いません。populate()exchangeArray()ClassMethods

Classmethod ハイドレーターを使用するときに正しい主キー値を設定する最良の方法は何ですか?エンティティをフォームにバインドする前にこの値を設定する必要がありますか? または、クラスメソッド H を拡張して、初期化時にこのタスクを実行する必要がありますか?

4

2 に答える 2

2

エンティティでデータ レイヤーの知識を使用するのは好きではありません。使用exchangeArray()する場合は、エンティティ自体にマッピングを作成します。Zend のハイドレーターについて調査したところ、これを含むサーバルの投稿に出くわしました。ハイドレーターを拡張するアンドリューの例は、ClassMethods列名をゲッター/セッター名にマップするための良いアプローチのように見えました。

ハイドレーターを伸ばすときClassMethodsもできますimplement Zend\Stdlib\Hydrator\HydratorInterface

データ操作にはハイドレーター戦略を使用します。

http://framework.zend.com/manual/2.0/en/modules/zend.stdlib.hydrator.strategy.html http://juriansluiman.nl/nl/article/125/strategies-for-hydrators-a-practical -使用事例

複数のデータ ソースからエンティティを分離するには、ハイドレーター フィルターを使用できます。たとえば、デフォルトでは、ClassMethodsハイドレーターは get で始まるすべてのエンティティ メソッドを抽出します。

http://framework.zend.com/manual/2.1/en/modules/zend.stdlib.hydrator.filter.html

于 2013-07-10T11:32:47.427 に答える
1

Zend\Stdlib\Hydrator\ClassMethods を拡張し、ここで必要な変換を行うことができます。

その後、mapField を使用して、フィールドの 1 つから正しい id フィールド名にマップできます。

namespace Application\Model;

use Zend\Stdlib\Hydrator\ClassMethods;

class MyHydrator extends ClassMethods
{
    /**
     * Extract values from an object
     *
     * @param   object $object
     * @return  array
     * @throws  Exception\InvalidArgumentException
     */
    public function extract($object)
    {            
        $data = parent::extract($object);
        $data = $this->mapField('id', 'user_id', $data);

        return $data;
    }

    /**
     * Map fields
     * 
     * @param type $keyFrom
     * @param type $keyTo
     * @param array $array
     * @return array
     */
    protected function mapField($keyFrom, $keyTo, array $array)
    {
        $array[$keyTo] = $array[$keyFrom];
        unset($array[$keyFrom]);

        return $array;
    }
}

または、設定/取得が必要な id フィールドのゲッターとセッターを作成することもできます。たとえば、 'user_id' という ID がある場合:

public function getUserId() { .. }

public function setUserId($id) { .. }
于 2013-01-24T15:16:56.323 に答える