Что не так в Yii 2
1. Провайдеры и связанные классы делали слишком много: работали с запросом, геренили URL, получали данные, валидировали их и так далее.
2. Много всего было завязано на Model и active record.
Текущий код
https://github.com/yiisoft/data/pull/3
Идеи
Главная идея в том, чтобы представить данные в простой табличной форме. То есть все строки одного вида со сходными именованными полями.
Для того, чтобы поддержать максимальное количество источников данных, data reader не читает данные до вызова read(). Все остальные методы меняют только критерий для чтения. Это позволяет эффективно работать с SQL и другими источниками, поддерживающими свой язык запросов. Реализовать своё хранилище такой подход также не мешает.
Интерфейсы
Интерфейсы делятся на три группы:
1. DataProcessorInterface для унификации групповой обработки.
2. DataWriterInterface для записи данных.
3. DataReaderInteface и связанные интерфейсы для поддержки дополнительных возможностей:
- CountableDataInterface - для получения общего числа данных в провайдере.
- FilterableDataInterface - для фильтрации данных на основе критериев.
- SortableDataInterface - для сортировки по одному или нескольким полям.
- OffsetableDataInterface - для пропуска первых N строк данных.
Сортировка данных
Сортировка сделана похоже на Yii 2, но не работает с запросом:
Код: Выделить всё
$sort = (new Sort([ // <--- задаём конфиг
'b' => [
'asc' => ['bee' => SORT_ASC],
'desc' => ['bee' => SORT_DESC],
'default' => 'asc',
'label' => 'B',
]
]))
->withOrder([ // <--- применяем сортировку
'a' => 'desc',
'b' => 'asc',
]);
Код: Выделить всё
$sort->withOrderString('-a, b'); // a DESC, b ASC
Фильтрация
Здесь я немного застопорился. Сейчас есть набор критериев, которые достаточно общие для всех data reader (Reader\Criterion):
Код: Выделить всё
$criteria = new AndAll(
new Compare('test', 42),
new Compare('test2', 34),
new OrAny(
new LessThan('temperature', 10),
new GreaterThan('temperature', 30)
)
);
Код: Выделить всё
$filter = new Filter($criteria->toArray());
С кодом есть проблемы:
1. Критерии сейчас практически не расширяются.
2. Реализовать применение критериев в data reader не просто.
По этой части хочется услышать идей и, возможно, получить помощь.
Постраничная разбивка
В пакете есть два вида постраничной разбивки. Классический offset и keyset. Data reader должен реализовать набор необходимых для конкретного вида постраничной разбивки интерфейсов. Классы постраничной разбивки не работают с запросом, но все необходимые данные передавать и получать достаточно легко.