问题标签 [zend-hydrator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
292 浏览

php - 如何使用 Zend Hydrator 将具有私有属性的 PHP 对象转换为数组?

代码

输出

问题

我的目标是从一个数组可以递归的对象中生成一个数组。Zend 提供了一个 hydrator,它可以提取对象属性并将它们放入数组中。但它只在第一级这样做并且它不会进一步递归(即当我希望将它们变成一个数组时,它保留了上面的私有成员)。

有没有办法从这样的对象中生成一个数组?注意:我有不同的对象作为私有成员,它们与这个简化示例中的对象不同。

有问题的 Hydrator 不会继续递归地提取私有对象属性。

我会接受其他不使用 Hydrator 的答案,只要它们相当优雅,但如果\Zend\Hydrator出现使用的答案,我会接受那个答案。

0 投票
1 回答
776 浏览

zend-framework2 - 使用水合器创建复杂模型:聚合/策略

我之前使用服务层构建了复杂的模型(一个包含许多其他类型模型的对象),其中不同的映射器作为构造函数传入。

例如。

上面是一个简化的例子。在我的领域中,我使用工厂中使用的多种服务来创建复杂的对象图。

在阅读了MaltBlue上关于聚合水合器的非常有趣的文章后,我尝试采用这种方法来简化对象创建过程。我喜欢创建一个 HydratingResulset 并将 RowObjectPrototype 设置为要返回的对象的想法。

我想我需要一些关于如何在现实世界中进行这项工作的指示。例如,当使用 AggregateHydrator 时,我可以根据传递给 hydrator 的用户 ID 加载用户约会历史记录。

...例如,用户地址水合器看起来像这样:

这完美地工作。尽管使用了 AggregateHydrator 方法,但这意味着每个具有 Address 作为属性的对象都意味着它需要自己的 hydrator。因此,如果我正在构建一个也有地址的公司模型,则需要另一个(几乎相同的)水合器,因为上面的水合器是硬编码的以填充用户模型(并期望包含 userId 键的数据)。这意味着对于每个关系/交互(has-a)都需要它自己的 hydrator 来生成它。这正常吗?所以我需要一个 UserAddressHydrator、CompanyAddressHydrator、SupplierAddressHydrator、AppointmentAddressHydrator - 都与上述代码几乎相同,只是填充不同的对象?

拥有一个 AddressHydrator 会更简洁,它接受一个 addressId 并返回 Address 模型。这导致我查看 hydrator 策略,这似乎是完美的,尽管它们仅适用于单个值,因此无法查看传入数组以查看是否存在 pk/fk / 识别键并基于该值加载.

我很感激对这种方法的一些澄清,感觉就像我一路迷路了。

0 投票
1 回答
116 浏览

php - ZendFramework 2 - 删除 InputFilter 会导致自定义过滤器中的不当行为

我有一个注册表单 User\UserForm,其中包含一个字段集 User\UserFieldset。在 User\UserFieldset 中,我放置了一个名为“passwordVerify”的字段,该字段应与字段集中名为“password”的另一个字段相同。这工作正常。

但是,如果管理员想要修改 Admin\UserForm 中的用户帐户,其中也包含 User\UserFieldset,则应删除字段集中 User\UserFieldset 中的字段“passwordVerify”。因此,我在 Admin\UserForm 中调用以下内容:

正如预期的那样,表单现在缺少“passwordVerify”字段。

如果我在编辑某些内容后保存表单,我的自定义过滤器“PasswordFilter”将无法再检索字段集的绑定对象($this->getOption('object');返回一个用户对象) - 但绑定对象的所有属性都为空。如果我在不删除“passwordVerify”-field 和“passwordVerify”-inputfilter 的情况下使用 Admin\UserForm,则一切正常,绑定对象将传递给具有填充属性的“PasswordFilter”(就值而言,由用户在 Admin\用户窗体)。打破一切的线是$this->getInputFilter()->get('user')->remove('passwordVerify')。所以这导致了我的假设,即通过删除输入过滤器,水合对象会以某种方式被清空/清空。以下是我的一些代码摘录,如果需要,我可以提供有关工厂等的更多信息。

管理员\用户窗体:

用户\用户字段集:

密码过滤器:

有什么线索吗?我是否在实例化过程的早期调用“passwordVerify”的删除输入过滤器?我还测试了在我的控制器中删除“$this->form->bind($user)”之后的 inputFilter 和字段,这也可以。如果我在 Admin\UserForm 中删除它,为什么它不起作用,我认为这是管理“passwordVerify”-stuff 的更干净的方式?

0 投票
1 回答
161 浏览

zend-framework2 - zf2 - 嵌套聚合水合器

是否可以嵌套聚合水合器?如果我有以下课程:

...正在填充以下 AggregateHydrator(从工厂创建):

UserHydratorFactory 看起来像:

}

当模型返回为空时,这是一个期望,但是如果我注释掉将位置水合器添加到用户水合器,它工作正常(尽管没有加载位置数据)。所以我想知道聚合水合器是否能够嵌套?

0 投票
1 回答
54 浏览

php - 为什么 martyshka/ShoppingCart ZF2 组件不起作用(可能是 hidrator 问题)?

我在尝试实现 martyshka/ShoppingCart 组件时非常头疼。我发现的只是水合器在添加项目时为空,但是当我强制它时它也不起作用(将它设置在组件上)。

这是我的控制器

这是组件回购

0 投票
0 回答
140 浏览

php - 补水和使用ZF2骨料补水剂

是否使用适合这种情况的聚合水合器?如果是这样,我将如何为这些实体补水,我发现文档令人困惑,并且在网上找不到任何示例。

我有两个具有多对多关系的实体。其中一个实体的某些属性取决于关系。

例子

这是两个具有多对多关系的实体,使用数据库中的关系表进行维护。问题对象的 size 属性取决于关系的哪个应用程序。

图表

数据库是这样布置的。 图表

所以这个想法是每个应用程序可以有多个问题,并且每个问题的大小可以为每个应用程序单独设置。

我对聚合 hydrator 的理解是,我有一个普通的 hydrator 最初可以为应用程序和问题实体进行水合,然后聚合将使用它之前水合的两个实体来水合最终的应用程序实体。这是正确的,我可能是非常错误的。

是否可以在没有聚合水合器的情况下对这样的物体进行水合,最好的方法是什么?

0 投票
1 回答
53 浏览

php - 将多维数组转换为对象(但不转换为 stdClass)

我有一些项目是从外部 API 大维数组中获取的。这个 api 在许多维度上返回 JSON。我必须对这些数据进行许多操作,所以我想将此嵌套数组更改/转换为我的对象类,而不是 StdObject。我一直在寻找最好的方法,我尝试了两种解决方案:

  1. 我编写了 hydrator,它将我的维度数组转换为我的 Entity 对象。但是当这个数组中有许多不同类型的数据时,水合器代码就不那么好了。
  2. 另一种方法是一些循环并序列化每个级别数组以拥有许多实体类。最后以某种方式合并到一个对象

下面放示例多维数组:

结局我想用这个数组中的数据从我自己的类中获取一个对象,但我并没有将数组中的所有数据“放入”到mam propetris 对象中,只有一些被选中。而且我不想得到对象 StdObject。也许您知道更好的方法,我发现仅在第 1 点和第 2 点中描述。我将不胜感激任何提示和帮助

0 投票
0 回答
112 浏览

zend-framework3 - Zend Framework 3 补水器

我有这个代码:

当我打印 $datas 我得到空对象

在我的控制器上,我有:

有什么建议吗?

0 投票
1 回答
43 浏览

zend-framework - 为什么我的 Zend-HAL 实现不能使用受保护的值

我是 Zend 框架的新手,并尝试使用 HAL 生成 API 响应。以下是我的问题的简单情况。

班上:

当我使用 hydrator 进行测试时,它的工作原理如下:

我的 HAL 配置如下:

我在 Zend expressive(版本 3)请求处理程序中使用以下行

链接生成正确,但元数据(版本信息)为空。任何帮助都感激不尽。

注意:我的真实代码很复杂,在这里我尝试生成一个更简单的问题版本。

0 投票
1 回答
61 浏览

zend-framework2 - ZF FactoryInterface - 使用选项参数配置加载依赖项

我想知道加载复杂对象的最佳实践。首先,在解决问题之前,我将概述一些样板文件。假设如下:一个简单的域模型客户端使用 tablegateway 加载,每个阶段都使用工厂来注入依赖项:

此 Client 对象的工厂:

接下来是使用 TableGateway 的映射器工厂:

TableGatewayFactory:

请注意使用 HydratingResultset 从 ResultSet 返回完全形成的 Client 对象。这一切都很好。现在客户端对象有几个相关的对象作为属性,所以在使用 HydratingResultSet 时,我将添加一个 AggregateHydrator 来加载它们:

最后,客户水合器工厂:

... 上述保湿剂的要点如下:

最后,我们解决了这个问题。以上工作完美,将非常干净地加载一个客户端对象,所有相关对象都完全形成。但是我有一些资源不需要整个对象图 - 例如,当查看所有客户端的表时 - 不需要加载任何更多信息。

所以我一直在考虑使用工厂来选择要包含的依赖项的方法。

解决方案 1 每个用例的工厂。如果只需要客户端数据(没有依赖关系),则创建一系列工厂,即 ClientFactory、SimpleClientFactory、ComplexClientFactory、ClientWithAppointmentsFactory 等。似乎是多余的,并且不是很可重用。

解决方案 2 使用 FactoryInterface 中定义的选项参数将“加载”选项传递给水合器工厂,例如:

映射器工厂将选项传递给 tablegateway 工厂,后者将它们传递给 hydrator 工厂:

最后,我们可以在这里定义要加载到客户端的信息量:

这似乎是一个干净的解决方案,因为可以根据请求定义依赖关系。但是我不认为这是按预期使用选项参数 - 文档指出该参数应该用于将构造函数参数传递给对象,而不是定义工厂应该使用什么逻辑来加载依赖项。

任何建议或实现上述目标的替代解决方案都会很棒。谢谢阅读。