ZF2 Classmethods Hydrator与RowGateway合作

时间:2012-11-19 04:01:51

标签: php entity zend-framework2

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

我还注意到ArraySerializable水箱调用populate()方法或exchangeArray(),此方法在编辑行时设置了相应的主键,不幸的是ClassMethods Hydrator没有那样做。

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

2 个答案:

答案 0 :(得分:2)

我不喜欢在我的实体中使用数据层的知识。使用exchangeArray()时,您可以在实体本身中创建映射。我做了一些关于Zend的水合物的研究,并且发现了包括这个在内的serrary帖子。安德鲁扩展ClassMethods水化器的例子似乎是将列名称映射到getter / setter名称的好方法。

延长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-use-case

要在多个数据源上分隔您的实体,您可以使用水分过滤器。例如,默认情况下,ClassMethods水合器从get。

开始提取所有实体方法

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

答案 1 :(得分: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) { .. }