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()”。