/yii2_pg_test

Primary LanguagePHPMIT LicenseMIT

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