水合对象无法存活
Hydration object doesn't survive
我从 AbstractHydrator
中导出了我的 class,我正在尝试按如下方式获取数据:
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
return 是一个具有填充值的有效对象,但是,结果 (json) 使用 return 从 JsonModel
创建ed values returns 一个 null
s 的数组,数量等于 table 行。
这是我的出厂配置:
'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
能够在 return 中生存,我应该怎么做?例如,当我尝试将 ClassMethods
水化器与 getter 和 setter 一起使用时,它工作得很好,所以我认为问题出在这个 class.
看起来您使用的 'hydration strategy' 而不是 'naming strategy' 作为 $property
值。
混淆是可以理解的,但需要明确的是,'naming strategies'用于修饰目标对象属性 名称和'strategies'用于修改给定字段的 value.
首先,改变工厂,改用AbstractHydrator
的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);
}
然后更新水化器以检查命名策略和水化值策略,如果找到则应用它们。 AbstractHydrator
有方便的方法 hydrateName
and hydrateValue
可以做到这一点。
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;
}
你当然可以用 extract()
做相反的事情。
我不知道这是否适用于其他 ViewModel
,但在某些时候有一些明显的事情让我印象深刻。
也就是说,JsonModel
需要 hydrate
,以便在获取数据时填充对象,以及 extract
,因为 JsonModel
需要 array
, 实现的方法。
如果您未能交付 extract
的实现,您的对象将以 array
的原始形式返回,并且 JsonModel
会将每个对象转换为 null
对象。
我从 AbstractHydrator
中导出了我的 class,我正在尝试按如下方式获取数据:
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
return 是一个具有填充值的有效对象,但是,结果 (json) 使用 return 从 JsonModel
创建ed values returns 一个 null
s 的数组,数量等于 table 行。
这是我的出厂配置:
'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
能够在 return 中生存,我应该怎么做?例如,当我尝试将 ClassMethods
水化器与 getter 和 setter 一起使用时,它工作得很好,所以我认为问题出在这个 class.
看起来您使用的 'hydration strategy' 而不是 'naming strategy' 作为 $property
值。
混淆是可以理解的,但需要明确的是,'naming strategies'用于修饰目标对象属性 名称和'strategies'用于修改给定字段的 value.
首先,改变工厂,改用AbstractHydrator
的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);
}
然后更新水化器以检查命名策略和水化值策略,如果找到则应用它们。 AbstractHydrator
有方便的方法 hydrateName
and hydrateValue
可以做到这一点。
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;
}
你当然可以用 extract()
做相反的事情。
我不知道这是否适用于其他 ViewModel
,但在某些时候有一些明显的事情让我印象深刻。
也就是说,JsonModel
需要 hydrate
,以便在获取数据时填充对象,以及 extract
,因为 JsonModel
需要 array
, 实现的方法。
如果您未能交付 extract
的实现,您的对象将以 array
的原始形式返回,并且 JsonModel
会将每个对象转换为 null
对象。