Php ZF2类或使用RowGateway

Php ZF2类或使用RowGateway,php,entity,zend-framework2,Php,Entity,Zend Framework2,我正在尝试将RowGateway类实现到我的实体中,我已经有了一个使用实体的表单,并且我正在尝试将该类设置为使用ClassMethods 我还注意到,ArraySerializablehydrator调用了populate()方法或exchangearlay(),该方法在编辑行时设置了相应的主键,不幸的是ClassMethodshydrator没有这样做 在使用Classmethod时,设置正确主键值的最佳方法是什么?或者,在将实体绑定到表单之前是否应该设置此值?或者,我是否应该扩展Classm

我正在尝试将
RowGateway
类实现到我的实体中,我已经有了一个使用实体的表单,并且我正在尝试将该类设置为使用
ClassMethods

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


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

您可以扩展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\u id”的id:

public function getUserId() { .. }

public function setUserId($id) { .. }

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

扩展
ClassMethods
hydrator时,您还可以
实现Zend\Stdlib\hydrator\HydratorInterface

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

要在多个数据源上对实体进行操作,可以使用或过滤器。例如,默认情况下,
ClassMethods
命令会提取以get开头的所有实体方法


我接受这个答案,因为经过大量阅读,我发现对象填充应该通过水合器进行,而定制水合器将是最好的方法。最后我使用了,因为它提供了一个扩展的db层,并且包含的工具提供了所需的功能。我认为你的classmethods扩展非常好。但是,我认为getter/setter建议有问题,它不适用于classmethods,因为最初永远不会设置值(如果UserId不作为列名存在,则永远不会调用“setUserID()”。