Zend Framework 2,当对象 属性 和数组键不匹配时如何水合?

Zend Framework 2, How do I hydrate when object property and array key don't match?

我有以下数组:

$arr = array(
    'Profile' => 'myClient',
    'Vendor'  => 'myVendor',
);

以及以下class

class MyModel
{
    protected $client;
    protected $vendor;

    getClient()
    {
        return $this->client;
    }

    setClient($client)
    {
        $this->client = $client;
    }

    getVendor()
    {
        return $this->vendor;
    }

    setVendor($vendor)
    {
        $this->vendor = $vendor;
    }
}

注意数组和 class 都有 "vendor" 但数组有 "profile" 而 class 有 "client".

我想在 Zend Framework 2 中使用水化器通过水合物方法填充 MyModel 对象(示例假设水化器和 MyModel 原型已注入我的 class):

$obj = $this->hydrator->hydrate($arr, $this->myModelPrototype)

在转储 $obj 时您会看到:

MyModel Object
(
    [client:protected] =>
    [vendor:protected] => myVendor
)

然而,我想要的结果是这样的:

MyModel Object
(
    [client:protected] => myClient
    [vendor:protected] => myVendor
)

我的问题是,有没有什么方法可以自定义水化器,使其填充 "client" 属性 和 "Profile" 值?

起初,我以为我可以使用水化器策略,但它只能改变值,不能改变键。或者,也许这是我的应用程序中的某种设计缺陷,不应该有理由必须这样做?

感谢您的帮助/建议。

如果我理解你是正确的,你可以用 NamingStrategy 解决你的问题。 ZF2 发布了一些命名策略,用于多个水化器。不幸的是,我没有找到任何关于此的文档。您可以在此处找到现有的命名策略 https://github.com/zendframework/zend-stdlib/tree/master/src/Hydrator/NamingStrategy

此处提供了如何设置您自己的自定义命名策略的示例 http://blog.igorvorobiov.com/2014/12/29/advanced-hydrator-usage-in-zend-framework-2/,由 Igor Vorobiov 编写。

P.S.: 有当前命名策略的文档。我认为 MapNamingStrategy 符合您的需要。参见 http://framework.zend.com/manual/current/en/modules/zend.stdlib.hydrator.namingstrategy.mapnamingstrategy.html

HTH