问题标签 [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.
php - 如何使用 Zend Hydrator 将具有私有属性的 PHP 对象转换为数组?
代码
输出
问题
我的目标是从一个数组可以递归的对象中生成一个数组。Zend 提供了一个 hydrator,它可以提取对象属性并将它们放入数组中。但它只在第一级这样做并且它不会进一步递归(即当我希望将它们变成一个数组时,它保留了上面的私有成员)。
有没有办法从这样的对象中生成一个数组?注意:我有不同的对象作为私有成员,它们与这个简化示例中的对象不同。
有问题的 Hydrator 不会继续递归地提取私有对象属性。
我会接受其他不使用 Hydrator 的答案,只要它们相当优雅,但如果\Zend\Hydrator
出现使用的答案,我会接受那个答案。
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 / 识别键并基于该值加载.
我很感激对这种方法的一些澄清,感觉就像我一路迷路了。
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 的更干净的方式?
zend-framework2 - zf2 - 嵌套聚合水合器
是否可以嵌套聚合水合器?如果我有以下课程:
...正在填充以下 AggregateHydrator(从工厂创建):
UserHydratorFactory 看起来像:
}
当模型返回为空时,这是一个期望,但是如果我注释掉将位置水合器添加到用户水合器,它工作正常(尽管没有加载位置数据)。所以我想知道聚合水合器是否能够嵌套?
php - 补水和使用ZF2骨料补水剂
是否使用适合这种情况的聚合水合器?如果是这样,我将如何为这些实体补水,我发现文档令人困惑,并且在网上找不到任何示例。
我有两个具有多对多关系的实体。其中一个实体的某些属性取决于关系。
例子
这是两个具有多对多关系的实体,使用数据库中的关系表进行维护。问题对象的 size 属性取决于关系的哪个应用程序。
数据库是这样布置的。
所以这个想法是每个应用程序可以有多个问题,并且每个问题的大小可以为每个应用程序单独设置。
我对聚合 hydrator 的理解是,我有一个普通的 hydrator 最初可以为应用程序和问题实体进行水合,然后聚合将使用它之前水合的两个实体来水合最终的应用程序实体。这是正确的,我可能是非常错误的。
是否可以在没有聚合水合器的情况下对这样的物体进行水合,最好的方法是什么?
php - 将多维数组转换为对象(但不转换为 stdClass)
我有一些项目是从外部 API 大维数组中获取的。这个 api 在许多维度上返回 JSON。我必须对这些数据进行许多操作,所以我想将此嵌套数组更改/转换为我的对象类,而不是 StdObject。我一直在寻找最好的方法,我尝试了两种解决方案:
- 我编写了 hydrator,它将我的维度数组转换为我的 Entity 对象。但是当这个数组中有许多不同类型的数据时,水合器代码就不那么好了。
- 另一种方法是一些循环并序列化每个级别数组以拥有许多实体类。最后以某种方式合并到一个对象
下面放示例多维数组:
结局我想用这个数组中的数据从我自己的类中获取一个对象,但我并没有将数组中的所有数据“放入”到mam propetris 对象中,只有一些被选中。而且我不想得到对象 StdObject。也许您知道更好的方法,我发现仅在第 1 点和第 2 点中描述。我将不胜感激任何提示和帮助
zend-framework3 - Zend Framework 3 补水器
我有这个代码:
当我打印 $datas 我得到空对象
在我的控制器上,我有:
有什么建议吗?
zend-framework - 为什么我的 Zend-HAL 实现不能使用受保护的值
我是 Zend 框架的新手,并尝试使用 HAL 生成 API 响应。以下是我的问题的简单情况。
班上:
当我使用 hydrator 进行测试时,它的工作原理如下:
我的 HAL 配置如下:
我在 Zend expressive(版本 3)请求处理程序中使用以下行
链接生成正确,但元数据(版本信息)为空。任何帮助都感激不尽。
注意:我的真实代码很复杂,在这里我尝试生成一个更简单的问题版本。
zend-framework2 - ZF FactoryInterface - 使用选项参数配置加载依赖项
我想知道加载复杂对象的最佳实践。首先,在解决问题之前,我将概述一些样板文件。假设如下:一个简单的域模型客户端使用 tablegateway 加载,每个阶段都使用工厂来注入依赖项:
此 Client 对象的工厂:
接下来是使用 TableGateway 的映射器工厂:
TableGatewayFactory:
请注意使用 HydratingResultset 从 ResultSet 返回完全形成的 Client 对象。这一切都很好。现在客户端对象有几个相关的对象作为属性,所以在使用 HydratingResultSet 时,我将添加一个 AggregateHydrator 来加载它们:
最后,客户水合器工厂:
... 上述保湿剂的要点如下:
最后,我们解决了这个问题。以上工作完美,将非常干净地加载一个客户端对象,所有相关对象都完全形成。但是我有一些资源不需要整个对象图 - 例如,当查看所有客户端的表时 - 不需要加载任何更多信息。
所以我一直在考虑使用工厂来选择要包含的依赖项的方法。
解决方案 1 每个用例的工厂。如果只需要客户端数据(没有依赖关系),则创建一系列工厂,即 ClientFactory、SimpleClientFactory、ComplexClientFactory、ClientWithAppointmentsFactory 等。似乎是多余的,并且不是很可重用。
解决方案 2 使用 FactoryInterface 中定义的选项参数将“加载”选项传递给水合器工厂,例如:
映射器工厂将选项传递给 tablegateway 工厂,后者将它们传递给 hydrator 工厂:
最后,我们可以在这里定义要加载到客户端的信息量:
这似乎是一个干净的解决方案,因为可以根据请求定义依赖关系。但是我不认为这是按预期使用选项参数 - 文档指出该参数应该用于将构造函数参数传递给对象,而不是定义工厂应该使用什么逻辑来加载依赖项。
任何建议或实现上述目标的替代解决方案都会很棒。谢谢阅读。