水合对象无法存活

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 一个 nulls 的数组,数量等于 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.

首先,改变工厂,改用AbstractHydratorsetNamingStrategy()方法。

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