Где разместить логику php objectToArray? Какой слой?

Я разрабатываю приложение в Zend Framework и имею следующие уровни: контроллер, сервис, модель предметной области и сопоставитель.

Объекты моего домена должны быть представлены в виде массивов для нескольких разных целей. Например, преобразователь преобразует объект в массив перед его сохранением; форма требует массив в качестве параметра своего метода populate(); и есть еще несколько примеров.

Итак, мой вопрос: в каком слое я должен выполнять перевод в массив? Перевод объекта немного различается в зависимости от контекста, в котором он используется, например. идентификатор объекта не требуется при сохранении нового объекта, но требуется при сохранении обновлений или при заполнении формы.

Насколько я вижу, есть два варианта. Вариант 1 — выполнить перевод в каждом компоненте (то есть в маппере, форме и т. д.). Вариант 2 — поместить его в сам объект домена и позволить клиентскому коду передать параметр, чтобы определить, какой вариант массива им требуется, например. $array = $domObject->toArray('populateForm');

Вариант 1 предполагает достаточное количество дублирования, но, похоже, придерживается правила разделения интересов. Вариант 2 позволит избежать дублирования, но я не уверен, что объект предметной области должен представлять себя различными способами.

Возможно, доменный объект должен просто создавать «ванильный» массив, и каждый компонент должен адаптировать его для собственного использования? И еще один момент касается узоров. Должен ли я искать применить декоратор или какой-либо другой шаблон?

Ваши мысли очень ценятся!


person DatsunBing    schedule 20.09.2012    source источник


Ответы (1)


Мои мысли об этом во-первых, как вы думаете, вы делаете это правильно? Это звучит довольно сложно без каких-либо реальных знаний о проекте. Такое ощущение, что вы пытаетесь сделать типичное решение, которое сделал бы кто-то очень плохо знакомый с Zend, чтобы затем понять, что это не нужно. Опять же, я мало знаю о вашем проекте.

Во-вторых, я бы, наверное, поместил такой функционал в сервисный слой. Сервисный уровень для меня почти всегда был связан с манипулированием объектами.

person Undrium    schedule 20.09.2012