Антон Шевчук // Web-разработчик

PHP Framework Bluz. Обновление // PHP

Продолжаем пилить свой фреймворк для страждущих и просто любопытных. Фреймворк получается занятным, и чем дальше в лес, тем больше мне он нравится.

Skype-чат разработчиков Bluz фреймворка

Полгода назад я уже выкладывал обзор фреймворка, так что, возможно, буду повторяться

Зачем?

Хочется новенького, свеженького и интересного, да и мозги всегда приятно поразмять. Почему не «…», так он же:

  • Устаревший
  • Медленный
  • Банальный
  • Никакой
  • Изгой
  • … и просто надоел

Устаревший, значит выходит новая версия фреймворка, а в требованиях указана старая версия 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 — смотрим и пробуем ;)

© Антон Шевчук 2007-2017