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


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

我有以下数组:

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

以及以下类别的

class MyModel
{
    protected $client;
    protected $vendor;
    getClient()
    {
        return $this->client;
    }
    setClient($client)
    {
        $this->client = $client;
    }
    getVendor()
    {
        return $this->vendor;
    }
    setVendor($vendor)
    {
        $this->vendor = $vendor;
    }
}

请注意,数组和类都有"vendor",但数组有"profile",而类有"client"。

我想在Zend Framework 2中使用hydrate方法来填充MyModel对象(示例假设一个hydrator和一个MyModel原型已经注入到我的类中):

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

做$obj的转储你会期望看到这个:

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

然而,我想要的结果是:

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

我的问题是,有没有任何方法可以自定义hydrator,使其使用"Profile"值填充"client"属性?

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

谢谢你的帮助/建议。

如果我理解你是正确的,你可以用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撰写。

附言:有关于当前命名策略的文档。我认为MapNamingStrategy符合您的需求。请参阅http://framework.zend.com/manual/current/en/modules/zend.stdlib.hydrator.namingstrategy.mapnamingstrategy.html

HTH