2015-07-29 1 views
0

Можно/Как сделать ZF2 DoctrineObject hydrator обеспечить его выход в виде вложенного массива вместо массива с вложенными объектами сущностей?Как получить выход вложенного массива с помощью DoctrineObject Hydrator в ZF2?

Так что

Array 
(
    [id] => 123, 
    [title] => FooTitle, 
    [bar] => Array 
    (
     [id] => 567, 
     [title] => BarTitle 
    ) 
) 

вместо этого

Array 
(
    [id] => 123, 
    [title] => FooTitle, 
    [bar] => Bar Object 
    (
     [id] => 567, 
     [title] => BarTitle 
    ) 
) 

Дополнительная informaition/фон:

В приложении ZF2 я работаю, я использую Доктрина и имеют организации Foo и Bar. Существует OneToOne отношения между ними - Foohas aBar:

{ 
    "id": "123", 
    "title": "FooTitle", 
    "bar": { 
     "id": "567", 
     "title": "BarTitle" 
    } 
} 

Когда я извлечь Foo объект и передать его в DoctrineModule\Stdlib\Hydrator#extract(...) (в моем приложении это делается в ZF\Hal\Plugin#convertEntityToArray(...)), я получаю массив с элементом bar типа Bar.

На следующем этапе (на самом деле несколько вызовов позже) этот результат передается на Zend\View\Renderer\JsonRenderer#render(...), а затем на Zend\Json\Json::encode(...), который внутренне выполняет json_encode(...).

Так значение foo[bar] отфильтровывается и выход выглядит следующим образом:

{ 
    "id": "123", 
    "title": "FooTitle", 
    "bar": {} 
} 
+1

Не можете ли вы просто реализовать свои сущности «Zend \ Stdlib \ JsonSerializable», а затем 'JsonRenderer' будет использовать ваши предоставленные' jsonSerialize() 'функции? – Ankh

+0

Спасибо за подсказку! Да, его возможно и будет работать (просто проверено). Другим решением будет расширение гидратора «DoctrineObject» и создание элементов объекта в массивах. Но на самом деле я был уверен, что речь идет только о конфигурациях «DoctrineObject», и я просто не могу найти подходящую настройку. Не поддерживает ли эта функция «DoctrineObject»? – automatix

+0

Прошло некоторое время с тех пор, как я работал с Доктриной, но я думаю, что вы правильно поняли, что «DoctrineObject» должен уже предоставлять эту функцию, но только если вы предоставили стратегии, как подсубы должны быть гидратированы/извлечены , Если у него нет связанной стратегии, он просто вернет объект. См. [Здесь] (https://github.com/doctrine/DoctrineModule/blob/master/src/DoctrineModule/Stdlib/Hydrator/DoctrineObject.php#L171) и [здесь] (https://github.com/zendframework/ Зенд-STDLIB/блоб/ведущий/SRC/гидратор/AbstractHydrator.php # L124) – Ankh

ответ

0

Целью DoctrineObject увлажняющего является гидрат объектов из массивов или извлечение объекта массивов. Если вы не хотите генерировать объект, вы должны использовать ArraySerializable hydrator, доступный в рамках Zend.

Смежные вопросы