yii2 + postgresql test task
Vagrant run
> vagrant up
Wait for provisioning...
> vagrant ssh
vagrant$ cd /vagrant
vagrant$ composer install
vagrant$ php app/yii migrate
vagrant$ php app/yii faker/generate \
--count=1000000 --dbprovider=YiiDAO \
generator_template=users dbprovider_table=users dbprovider_truncate=1
Fake data generation can take up to 1h
After fake data loaded, go http://localhost:8000/
Task comments (ru)
Работа со вьюхой спрятана в Query. Плюсы: можно прозрачно работать с Video моделью и определенные запросы будут проходить по вьюхе. Минусы - по мере увеличения вьюх и сложности запросов - может получится запутанная логика. Можно вынести эту логику в DataProvider.
Форма выглядит "а нахрена", но в общем предпочитаю так делать - по мере усложнения входящих данных там оно будет проверяться, валидироваться и так далее. Помогает держать контроллер тонким.
Модельки на предмет всяких безопасных атрибутов и валидации не делал, через gii не генерил, ну как бы задачи записи у нас нет. Но в общем не проблема, можно сделать через gii какой-нить BaseView и сделать родителем для View.
About task (ru)
На основе Yii2 basic application создать минипроект, в котором необходимо реализовать постраничный вывод контента. Единица контента видео, для каждого видео в списке выводится информация: Title (можно рандомно генерить чтото), Thumbnail (можно использовать картинку плейсхолдер), Duration (в базе секунды, выводится время в минутах:секундах для видео меньше часа, и полный формат если видео длиннее 60 минут), Views (количество просмотров, для теста задавать рандомно от 0 до 1 000 000), Added datetime (в базе timestamp, случайно задавать из какого то диапазона дат).
Список представлен в виде сетки (как на большинстве тубов) а не списка. Пейджер стандартный: first, prev, 1..2..3..Х (с ограничением), next, last. Количество на странице настраиваемое. Также должна присутствовать возможность сортировки данных в обе стороны (ASC \ DESC) по двум параметрам: views, date (пагинация должна учитывать сортировку). Cортировка по умолчанию: date desc Визуально можно сделать все на дефолтном бутстрапе. Важно правильно организовать структуру layout, view(s), widget(s) if needed. Урл вида /videos/, пейджер и сортировка в виде /videos/5?sort=views_desc
Необходимо спроектировать структуру базы с учетом миллионов и десятков миллионов записей, чтобы пагинация и сортировка были практически мгновенными и по минимуму зависели от количества данных. Важно учитывать особенности PostgreSQL при решении данной задачи (подсказка: невозможность оптимизации count и offset, смотреть в сторону materialized view и window функций) Структура базы создается через миграцию. Тестовые данные (много миллионов записей) желательно генерить через консоль контроллер.
Технические требования: Ubuntu, nginx, PHP, 7 (phpfpm), Yii2 framework, PostgreSQL 9.5