Я разрабатываю «толстую модель» для моего проект с открытым исходным кодом, и я работаю над слоем, который будет находиться между ORM (RedBeanPHP) и контроллером.
У меня будет User
класс, и, вероятно, UserFactory
/UserMapper
класс, который может построить User
объекты, а также выполнять мета-действия, такие как usernameExists
, так далее.
Ряд других SO вопросов / сообщений в блоге указали, что если мне нужно получить коллекция из User
объекты, было бы неэффективно иметь UserMapper
класс перебрать весь набор результатов и построить N User
объекты.
Моя идея заключается в том, чтобы создать UserCollection
класс, который реализует PHP ArrayObject
учебный класс. UserMapper
сможет создать UserCollection
который хранит необработанный результирующий набор внутри себя, как многомерный массив. Я мог бы затем реализовать ArrayObject
итераторные функции, []
и т. д., чтобы построить соответствующий User
объекты по запросу.
Это умный способ сделать это? Что я должен рассмотреть, прежде чем использовать этот подход?
Для рендеринга больших списков данных на самом деле будет медленнее использовать экземпляр на строку. Вот тут-то и пригодится модель легковес …
http://sourcemaking.com/design_patterns/Flyweight/php
Казалось бы, что это именно то, как ORM Laravel, Eloquent, делает это:
class Collection implements ArrayAccess, Arrayable, Countable, IteratorAggregate, Jsonable, JsonSerializable {
...
public function fetch($key)
{
return new static(array_fetch($this->items, $key));
}
}
Если бы самый популярный PHP-фреймворк делал это таким образом, я бы сказал, что это довольно хорошее одобрение.