Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 水合对象不';活不下去_Php_Zend Framework2 - Fatal编程技术网

Php 水合对象不';活不下去

Php 水合对象不';活不下去,php,zend-framework2,Php,Zend Framework2,我从abstractor派生了我的类,我试图获得如下数据: public function hydrate (array $data, $object) { foreach ($data as $key => $value) { $property = $this->getStrategy('default')->hydrate($key); $object->$property = $value; } var_du

我从
abstractor
派生了我的类,我试图获得如下数据:

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
s数组

这是我的工厂配置:

'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
在返回后继续生存,我应该做什么?例如,当我尝试使用带有getter和setter的
ClassMethods
hydrator时,它工作得非常好,因此我假设问题在于这个类。

看起来您对
$property
值使用的是“hydration策略”,而不是“命名策略”

这种混淆是可以理解的,但要清楚,“命名策略”用于修改目标对象属性名称,“策略”用于修改给定字段的值

首先,更改工厂并改用
abstractor
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);
}
然后更新水合器,检查命名策略和水合值策略,如果发现,则应用它们。
abstractor
具有方便的方法和方法

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
s,但在某个时候,我突然想到了一些明显的事情

也就是说,
JsonModel
既需要
hydrate
,以便在获取数据时填充对象,也需要
extract
,因为
JsonModel
需要实现一个
数组

如果未能交付
提取
的实现,对象将以原始形式返回
数组
,并且
JsonModel
将每个对象转换为
null
对象