我从AbstractHydrator
派生了我的课程,我正在尝试获取如下数据:
public function hydrate (array $data, $object)
{
foreach ($data as $key => $value) {
$property = $this->getStrategy('default')->hydrate($key);
$object->$property = $value;
}
var_dump($object);
return $object;
}
var_dump
返回一个带有填充值的有效对象,但是,使用这些返回值从JsonModel
创建的结果(json)返回数量相等的null
数组表行。
这是我的工厂配置:
'UserTableGateway' => function ($sm)
{
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$hydrator = new \Core\Hydrator\TableEntityMapper();
$hydrator->addStrategy('default', new UserNamingStrategy());
$resultSet = new \Zend\Db\ResultSet\HydratingResultSet(
$hydrator, new User());
return new TableGateway('users', $dbAdapter, null, $resultSet);
}
我应该怎样做才能让$object
在返回后幸存?它可以正常工作,例如当我尝试使用ClassMethods
保湿器和吸气剂和设定器时,所以我认为问题在于这个类。
答案 0 :(得分:1)
看起来你正在使用'水合策略'而不是$property
值的'命名策略'。
混淆是可以理解的,但要明确的是,“命名策略”用于修改目标对象属性 name ,“策略”用于修改给定字段的值< / em>的
首先,更改工厂并使用AbstractHydrator
的{{1}}方法。
setNamingStrategy()
然后更新水化器以检查命名策略和水合值策略,并在找到时应用它们。 'UserTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$hydrator = new \Core\Hydrator\TableEntityMapper();
// UserNamingStrategy should be of type NamingStrategyInterface
$hydrator->setNamingStrategy(new UserNamingStrategy());
$resultSet = new \Zend\Db\ResultSet\HydratingResultSet($hydrator, new User());
return new TableGateway('users', $dbAdapter, null, $resultSet);
}
有便捷方法hydrateName
和hydrateValue
这样做。
AbstractHydrator
您当然可以使用public function hydrate (array $data, $object)
{
foreach ($data as $name => $value) {
$property = $this->hydrateName($name);
// $data is optionally passed in as context
$object->$property = $this->hydrateValue($name, $value, $data);
}
return $object;
}
执行与此相反的操作。
答案 1 :(得分:0)
我不知道这是否适用于其他ViewModel
,但某些事情在某些方面让我感到震惊。
即,JsonModel
需要hydrate
,以便在获取数据时填充对象,以及extract
,因为JsonModel
需要array
,实施的方法。
如果您未能提供extract
的实施,您的对象将以原始格式array
返回,而JsonModel
会将每个对象转换为null
对象。