Продолжаем пилить свой фреймворк для страждущих и просто любопытных. Фреймворк получается занятным, и чем дальше в лес, тем больше мне он нравится.
Полгода назад я уже выкладывал обзор фреймворка, так что, возможно, буду повторяться
Зачем?
Хочется новенького, свеженького и интересного, да и мозги всегда приятно поразмять. Почему не «…», так он же:
- Устаревший
- Медленный
- Банальный
- Никакой
- Изгой
- … и просто надоел
Устаревший, значит выходит новая версия фреймворка, а в требованиях указана старая версия PHP, или вот смотришь в код, а там половина кода висит для обеспечения обратной совместимости. Медленный, ну тут понятно. С определением банальной чуть посложнее, скажем так — это не фреймворк, а скорее удачная подборка классов, которая у каждого разработчика есть. Никакой — это неудачная подборка классов для проекта. Изгой, это тот, который разрабатывается с оглядкой на …
Ещё подумаю и напишу сюда несколько критериев
Что предлагаем?
- Usability кода, т.е. в первую очередь я хочу чтобы вы наслаждались разработкой проекта, а не тихо ругались вслух.
- Если же ругаться очень хочется, то пожалуйста, можете на русском, мы поймём и простим
- Добавляем в код новые плюшки языка, и стараемся использовать их на полную катушку, таким образом с нами не заржавеете
- Настраиваем процесс разработки «правильно» — VCS, unittests, CI, и учим этому других
- Пока посылаем нафиг обратную совместимость со старыми версиями, не ну те то чтобы совсем, но мне кажется лучше написать талмуд по миграции кода для разработчиков, чем выступать в роли хомяка, которые запасается кодом впрок.
Что ещё?
А ещё есть идеология:
- фреймворк должен быть прозрачен для разработчика, так чтобы всё происходящее мог объяснить даже начинающий разработчик
- фреймворк должен быть предсказуем, если у вас падает сайт, вы должны понимать откуда ноги растут
- фреймворк должен быть удобен в работе, чтобы у вас не возникало желание переписать код на «чистом» PHP
Давай по сути, не томи
Да вот начну с контроллеров, представляют они собой анонимную функцию, в которую можно замкнуть объект View, если понадобится:
<?php return /** * @privelege View User Profile * @methods GET,POST * @route /profile/{$id}/ * @cache 5 minutes * @param integer $id * @return closure */ function($id) use ($view) { /** * @var Application $this * @var View $view */ $view->user = Users\Table::findRow($id); };
Более подробно описано в wiki — framework/wiki/Controller
Вернемся ко View. Возможно вы уже знаете, что я приверженец нативных шаблонизаторов, посему и в Bluz используется такой же:
return /** * @var Bluz\View $view * @return closure */ function() use ($view) { $view->title = "Hello world" };
Собственно код шаблона:
<h2><?=$title?></h2> <!-- так тоже работает --> <h2><?=$this->title?></h2>
Всякие мелкие фишки по работе с шаблонизатором описаны в соответствующем разделе framework/wiki/View
Ну осталось ещё о моделе замолвить слово, в фреймворке для этого есть классы Table и Row — это некое подобие active record:
<?php namespace Application\Users; class Row extends \Bluz\Db\Row { public function beforeInsert() { $this->created = gmdate('Y-m-d H:i:s'); } public function beforeUpdate() { $this->updated = gmdate('Y-m-d H:i:s'); } } $userRow = new Users\Row(); $userRow -> login = 'username'; $userRow -> save(); $userRow = Users\Table::findRow(42); // or $userRow = Users\Table::findRowWhere(['login'=>'username']);
Маршрутизация
Организация маршрутизации проста до безобразия, указываем непосредственно в комментариях контроллера правила по которым к нам будут приходить в гости:
/** * @route /users/{$id} * @param integer $id */
При использование не требуют явного указания имени (привет ZF):
<?php $this->url('users', 'login'); $this->url('users', 'profile', array('id' => $id)); $this->url('pages', 'show', array('name' => $name)); ?>
Конечно, подобная реализация не без недостатков, но таки вполне юзабельно, и под стать фремворку.
Раздача прав доступа
За данный функционал отвечает пакет Acl, и как вы уже догадались — привилегия для доступа к контроллеру так же указывается в аннотации:
Это ещё не всё
Есть ещё кеширование контроллеров, и его настройки тоже указываем в комментариях; есть приведение типов входных параметров функции (что ловятся из запросов); да ещё есть ограничение по тому как можно запросить метод (POST, CLI, etc):
О скелете
В довесок к фреймворку идёт полуфабрикат CMS — skeleton, который представляет из себя готовые модули да обвязку из Twitter Bootstr’a и готовых Javascript’ов (с АМД на require.js). Из готового и удобного:
<!-- AJAX request --> <a class="ajax" href="/get">Click Me!</a> <!-- Confirm dialog --> <a class="confirm" href="/delete/id/42" data-confirm="Are you sure?">Click Me!</a> <!-- Confirm dialog + AJAX Request --> <a class="ajax confirm" href="/delete" data-id="42">Click Me!</a> <!-- Call dialog window, load content over AJAX --> <a class="dialog" href="/dialog">Click Me!</a>
В скелете так же есть один полезный модуль — test — это подборка «рецептов» в которые полезно заглядывать.
И в догонку
Есть еще пачка пакетов, пожалуй стоит привести их список:
- Cache — очень простая обёртка над memcached
- EventManager — события и их обработчики
- Registry — тут без комментариев
- Request — объект запроса, сам по себе используется редко
- Session — лишь обёртка над адаптерами сессии
- И ряд других — всё в wiki
Выводы
Bluz фреймворк предназначен для небольших проектов и проектов средней сложности, для которых использование тяжеловесных собратьев не рационально, а микрофреймворки не предоставляют всего необходимого (к примеру MVC уж очень хочется). Bluz не будет становится на путь развития ZF/Symfony/etc, ведь нам не нужен ещё один монстр?..
Ну и для расширения кругозора, для углубления знаний о PHP 5.4, да и просто ради любопытства — github.com/bluzphp — смотрим и пробуем ;)
Здравствуйте.Решил попробовать ваш фреймворк, склонировал проект(скелетон) с гитхаба, подгрузил все зависимотсти. Но почему-то вылает ошибку 503. РНР обновлен до версии 5.4.
Хм, странное дело, можете включить debug режим, для этого достаточно добавить куку debug (для этого пользуюсь букмарклетом – https://github.com/bluzphp/skeleton/wiki/Module-System)
Хотел помощью xDebug пощупать фреймовк, оказалось не все так просто.
В файле .htaccess
пришлось подправить xdebug.profiler_enable
Будем щупать, пробовать.
Хотя это все можно включить было с помощью https://github.com/bluzphp/skeleton/wiki/Module-System
ссылке упомянутой в ответе на первый пост
При каждом обнаружении логотипа фреймворка, как ни стараюсь, не могу правильно прочитать. Все время читается Блази (Bluzy) =)
Сделали что-то похожее (с аннотациями) для одного API-centric приложения. В аннотации сознательно не положили роуты, потому что удобно, когда есть одно место, где ты можешь разобраться, что куда роутится, а не лазать по всем классам, пусть даже и поиском.
Энтузиазма к data-confirm=”Are you sure?” не разделяю, но это потому что я пишу RIA (ExtJS), а там это не надо вообще. Возможно, на обычном сайте вполне удобно. Фигово в подходе то, что нет единого места, где ты можешь все это заоверрайдить. В Yii, например, куча таких виджетов. И для поделки-админки это нормально, а для серьезного стайлинга не удобно, потому что проще было бы это реализовать ручками. Опять же, это взгляд JS-dev :-)