Продолжаем пилить свой фреймворк для страждущих и просто любопытных. Фреймворк получается занятным, и чем дальше в лес, тем больше мне он нравится.
Полгода назад я уже выкладывал обзор фреймворка, так что, возможно, буду повторяться
Зачем?
Хочется новенького, свеженького и интересного, да и мозги всегда приятно поразмять. Почему не «…», так он же:
- Устаревший
- Медленный
- Банальный
- Никакой
- Изгой
- … и просто надоел
Устаревший, значит выходит новая версия фреймворка, а в требованиях указана старая версия PHP, или вот смотришь в код, а там половина кода висит для обеспечения обратной совместимости. Медленный, ну тут понятно. С определением банальной чуть посложнее, скажем так — это не фреймворк, а скорее удачная подборка классов, которая у каждого разработчика есть. Никакой — это неудачная подборка классов для проекта. Изгой, это тот, который разрабатывается с оглядкой на …
Ещё подумаю и напишу сюда несколько критериев
Что предлагаем?
- Usability кода, т.е. в первую очередь я хочу чтобы вы наслаждались разработкой проекта, а не тихо ругались вслух.
- Если же ругаться очень хочется, то пожалуйста, можете на русском, мы поймём и простим
- Добавляем в код новые плюшки языка, и стараемся использовать их на полную катушку, таким образом с нами не заржавеете
- Настраиваем процесс разработки «правильно» — VCS, unittests, CI, и учим этому других
- Пока посылаем нафиг обратную совместимость со старыми версиями, не ну те то чтобы совсем, но мне кажется лучше написать талмуд по миграции кода для разработчиков, чем выступать в роли хомяка, которые запасается кодом впрок.
Что ещё?
А ещё есть идеология:
- фреймворк должен быть прозрачен для разработчика, так чтобы всё происходящее мог объяснить даже начинающий разработчик
- фреймворк должен быть предсказуем, если у вас падает сайт, вы должны понимать откуда ноги растут
- фреймворк должен быть удобен в работе, чтобы у вас не возникало желание переписать код на «чистом» PHP
Давай по сути, не томи
Да вот начну с контроллеров, представляют они собой анонимную функцию, в которую можно замкнуть объект View, если понадобится:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | <?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 используется такой же:
1 2 3 4 5 6 7 8 | return /** * @var Bluz\View $view * @return closure */ function () use ( $view ) { $view ->title = "Hello world" }; |
Собственно код шаблона:
1 2 3 | <h2><?= $title ?></h2> <!-- так тоже работает --> <h2><?= $this ->title?></h2> |
Всякие мелкие фишки по работе с шаблонизатором описаны в соответствующем разделе framework/wiki/View
Ну осталось ещё о моделе замолвить слово, в фреймворке для этого есть классы Table и Row — это некое подобие active record:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | <?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' ]); |
Маршрутизация
Организация маршрутизации проста до безобразия, указываем непосредственно в комментариях контроллера правила по которым к нам будут приходить в гости:
1 2 3 4 | /** * @route /users/{$id} * @param integer $id */ |
При использование не требуют явного указания имени (привет ZF):
1 2 3 4 5 | <?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). Из готового и удобного:
1 2 3 4 5 6 7 8 | <!-- 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 :-)