水化物体不会存活

时间:2015-02-14 01:14:56

标签: php zend-framework2

我从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保湿器和吸气剂和设定器时,所以我认为问题在于这个类。

2 个答案:

答案 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); } 有便捷方法hydrateNamehydrateValue这样做。

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对象。