我正在尝试将RowGateway
类实现到我的实体,我已经有一个与该实体一起工作的表单,并且我正在尝试将保护器设置为与ClassMethods
一起使用。
我还注意到ArraySerializable
水箱调用populate()
方法或exchangeArray()
,此方法在编辑行时设置了相应的主键,不幸的是ClassMethods
Hydrator没有那样做。
使用Classmethod水化器时设置正确主键值的最佳方法是什么?我应该在将实体绑定到表单之前设置此值吗?或者,我应该扩展Classmethod H.以在初始化时执行此任务吗?
答案 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) { .. }