2

我正在尝试将RowGateway类实现到我的实体,我已经有一个与实体一起使用的表单,并且我正在尝试将水合器设置为使用ClassMethods

我还注意到hydrator在编辑行时ArraySerializable调用了该populate()方法或该方法设置了适当的主键,不幸的是 Hydrator 没有这样做。exchangeArray()ClassMethods

使用 Classmethod hydrator 时设置正确主键值的最佳方法是什么,我应该在将实体绑定到表单之前设置此值吗?或者,我应该扩展 Classmethod H. 以在初始化时执行此任务吗?

4

2 回答 2

2

我不喜欢在我的实体中使用数据层的知识。使用时,exchangeArray()您在实体本身中创建映射。我对 Zend 的 hydrators 做了一些研究,发现了包括这个在内的一些帖子。Andrew 扩展ClassMethodshydrator 的示例似乎是将列名称映射到 getter/setter 名称的好方法。

延长ClassMethods水合器时,您也可以implement Zend\Stdlib\Hydrator\HydratorInterface

对于数据操作,请使用hydrator 策略

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 从您的字段之一映射到正确的 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 字段创建一个 getter 和 setter,例如,如果您有一个名为 'user_id' 的 id:

public function getUserId() { .. }

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