Создаем видеобиблиотеку с PHPixieИсточник: habrahabr jigpuzzled
После моего предыдущего поста о выборе легкого Фреймворка я погуглил и увидел что для некоторых из них нет ни одного русскоязычного туториала. Так вот я решил написать серию постов дабы заполнить эту нишу. Я думаю стоит начать с тех на которых я в конце остановился, а так как для Silex написано уже достаточно много то этот пост будет посвящен PHPixie. Для тех кто не читал моего сравнения фреймворков, PHPixie - маленький и по моим меркам очень быстрый фреймворк с модульной структурой, хорошо реализованным DI, отсутствием статиков и простой архитектурой. На официальном сайте все туториалы написаны на примере фей, я же попробую быть оригинальным и мы создадим библиотеку видео из Youtube. То есть мы сможем добавлять, удалять и просматривать видео. А еще по дороге научимся использовать API самого ютуба для получения мета информации и тамбнейлов.
Создание проектаPHPixie можно установить либо используя Composer, либо скачав снапшот готовой системы с сайта. Разницы почти нет, так как снапшот регулярно обновляется и являет собой базовой проект с проинсталлированными тремя библиотеками (core, db и orm). Для простоты будем использовать второй метод, ссылка на снапшот здесь phpixie.com/phpixie.zip. Сервер надо настроить на папку /web/ внутри проекта. Вот и все, теперь можем зайти на наш хост и увидеть маленькое приветствие.
Объект $pixieОбъект $pixie - это имплементация DI Контейнера и Сервис Локатора, нечто похожее на $app в Silex. Он доступен как проперти контроллера и передается практически в каждый конструктор, $pixie также содержит фактори методы для каждого класса фреймворка. Грамотное использование его позволяет полностью избежать связывания классов а следовательно упростить тестирование. В отличии от Silex добавление методов и проперти в $pixie происходит только путем расширения класса. В базовом проекте уже присутстует класс App\Pixie который наследует от PHPixie\Pixie, как раз в него мы можем добавлять свой код чтобы иметь к нему доступ повсюду. Следует обратить внимание на то что это не синглтон и передавать его между классами приходится явно, такой подход был избран для избежания какого-либо глобального состояния в коде, аналогично фреймворк никогда не использует статические методы. Каждый модуль, например db или orm поставляет свой класс с фактори методами, эти классы прописываются в нашем App\Pixie в $modules. Потом мы можем запрашивать их как проперти, например используя $pixie->db->query() и $pixie->orm->get(), что вносит дополнительную структурированность и позволяет избежать супа из методов. В нашем случае менять в App\Pixie нам ничего не нужно.
База данныхМы будем использовать лишь одну простенькую табличку для хранение информации о видео, вот ее структура: Теперь прописываем настройки соединения к базе в /assets/config/db.php , например:
МодельЛюбая MVC структура начинается с модели, в нашем случае она только одна, Video. Кто знаком с Kohana сразу почувствует себя дома, для создания модели достаточно просто расширить класс \PHPixie\ORM\Model :
Базовая разметкаВ базовом проекте который ми скачали есть в наличии подвид контролера, класс App\Pixie. Его работа сводится к тому чтоб рендерить шаблон main.php доступный как проперти $view. Наши контроллеры просто передают разные данные в этот шаблон, включая $subview - имя подшаблона который надо вставить. Мне как раз очень понравилось то, что логика того как работают мастер-страницы и подшаблоны не прописана в самом фреймворке а выносится в сам проект, что позволяет переделать ее по своему усмотрению. Наш main.php будет выглядеть примерно так: Подшаблонов у нас всего два: list.php (для списка добавленных роликов) и view.php (для просмотра выбранного видео). Вот они:
РоутингЯ знаю что вы уже заждались самого кода, но перед тем как мы перейдем к контроллеру нам надо прописать его в /assets/config/routes.php. На самом деле в базовом проекте прописан только один роут и он выглядит как /контроллер/метод/id , что в принципе нас устраивает, но было б очень кстати по менять дефолтный контроллер из Hello на наш Videos.
КонтроллерПоскольку нам нужны 3 страницы в контроллере должно быть 3 метода. Вот с чего мы начнем: И вуаля! Вот кстати скриншот результата: |