Я пытаюсь реализовать шаблон репозитория в приложении Laravel 5, следуя этой статьи. В нем реализация репозитория преобразует объект для определенного источника данных (в данном случае Eloquent) в stdClass, чтобы приложение использовало стандартный формат и не заботилось об источнике данных.
Чтобы преобразовать один объект Eloquent, они делают это:
/**
* Converting the Eloquent object to a standard format
*
* @param mixed $pokemon
* @return stdClass
*/
protected function convertFormat($pokemon)
{
if ($pokemon == null)
{
return null;
}
$object = new stdClass();
$object->id = $pokemon->id;
$object->name = $pokemon->name;
return $object;
}
Или, как указал кто-то в комментариях, это также может работать:
protected function convertFormat($pokemon)
{
return $pokemon ? (object) $pokemon->toArray() : null;
}
Но что происходит, когда я хочу привести всю коллекцию объектов Eloquent к массиву ** stdClass
**? Должен ли я перебирать коллекцию в цикле и приводить каждый элемент отдельно? Я чувствую, что это будет большим ударом по производительности, поскольку мне придется зацикливаться и приводить каждый элемент каждый раз, когда мне нужна коллекция чего-то, и это также кажется грязным.
Laravel предоставляет Eloquent\Collection::toArray()
, который превращает всю коллекцию в массив массивов. Я полагаю, что это лучше, но все же не stdClass
Преимущества использования универсального объекта заключались бы в том, что я мог бы сделать это в своем коде.
echo $repo->getUser()->name;
Вместо того, чтобы делать это:
echo $repo->getUser()['name'];
array_map
для своего фактического вопроса? В чем проблема перебрать все? - person sisve   schedule 15.07.2015array_map
. Это отлично работает. Теперь я думаю о том, что вы сказали, и это имеет большой смысл. У меня есть дополнительный вопрос: имеет ли смысл размещать логику модели предметной области на сервисном уровне (используя здесь сервис-ориентированную архитектуру)? Тогда мой UserService будет содержать бизнес-логику и будет единственным, кто будет иметь дело с репозиторием. Мое приложение просто вызывало бы Службу, и это сделало бы UserService тем общим классом User, о котором вы упомянули, не так ли? - person Vic   schedule 15.07.2015array_map
в качестве ответа, и я приму его (если с ним не связаны проблемы с производительностью). - person Vic   schedule 15.07.2015