Я пытаюсь реализовать шаблон хранилища в приложении Laravel 5 следующим образом: this article. В нем реализация репозитория преобразует объект для конкретного источника данных (в данном случае Eloquent) в stdClass, так что приложение использует стандартный формат и не заботится о источнике данных.Кастинг Eloquent Collection (Laravel) в массив stdClass с использованием шаблона репозитория
Чтобы преобразовать один Красноречивый объект они делают это:
/**
* 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'];
Eeeww! Массивы! Потеря типов подсказок, моделей и методов ... Создайте пользовательский класс пользователя, если вы не хотите выставлять модель Eloquent, не используйте общие массивы. – sisve
Интересное предложение. Звучит неплохо, но потом, каждый раз, когда мне нужна была новая модель, мне пришлось бы создать модельный объект, интерфейс, репозиторий, который реализует этот интерфейс, и теперь _also_ общий класс, который будет возвращен репозиторием? Вся логика, которую должен иметь этот новый универсальный пользовательский класс, уже находится внутри репозитория, почему требуется еще _another_ абстракция? В конце концов, мне просто нужно получить доступ к данным, и для этого, как мне кажется, достаточно общего класса объектов. Или этот класс пользователя просто будет пустой оболочкой без методов и/или атрибутов? @SimonSvensson – Vic
Ваши репозитории должны иметь только логику доступа к базе данных, как данные загружаются (и, возможно, сохраняются). Такие вещи, как $ user-> setPassword ('...'), являются частью вашей модели домена и не принадлежат вашему репозиторию. Но вам все равно потребуется вызов $ repo-> persist ($ user), если вы также не реализуете какое-то отслеживание объектов. Я бы сказал, что вы должны использовать Doctrine вместо Eloquent, но это больше, чем просто пропуск массивов. Во всяком случае, вы пробовали использовать 'array_map' для вашего актуального вопроса? В чем проблема с переполнением всего? – sisve