Доброго времени суток обитатель habrahabr, сегодня я хочу тебе рассказать о новом релизе ffcms — 3.0.0 и кратко осветить кардинальные изменения, которые претерпела система с момента предыдущего релиза — 2.0.4.
Система сохранила бесплатную модель распространения и открытый исходный код (MIT), но исходный код был полностью переписан под MVC архитектуру и автозагрузку PSR-0. Многие «велосипеды» были убраны из системы, а их место заняли популярные компоненты: symfony http foundation, laravel eloquent и многие другие.
Переработка архитектуры системы
Обсуждая 2ую версию системы многие пользователи habrahabr советовали существенно переработать систему с учетом современных тенденций: добавить менеджер зависимостей и версий composer, ввести устоявшуюся MVC архитектуру и привести код к единому PSR-1/2 стилю. Код 2ой версии действительно имел достаточно низкое качество и об него можно было сломать ногу (а то и обе). Так же было отмечено, что модель разработки расширений 2ой версии является очень запутанной и избыточной, а вместе с синтаксисом api ядра у некоторых пользователей это вызывало душевную боль.
Внедрить современные инструменты и принципы разработки приложений было просто необходимо, однако переписывать существующий код было практически нереально — поэтому было принято решение переработать архитектуру системы «с нуля».
Система была разделена на несколько функциональных частей: базовая структура, ядро, консоль. Для каждой части был создан репозиторий, настроен composer и проект был опубликован на packagist. Все части связываются при помощи зависимостей в composer.json базового компонента.
Отказ от велосипедов
За последние годы разработки приложений я познакомился с большинством популярных фреймворков, такими как symfony, laravel, yii и codeigniter. Большинство «идей взаимодействий», которые я пытался самостоятельно реализовать в своей CMS, как не странно, уже были реализованы в популярных фреймворках — где то они монструозно сложны, где то — слишком просты и недостаточно функциональны. Многие из них мне понравились и я использую их по сей день, внедрив в ffcms.
Итак, следующие собственные части «велосипеда» были заменены на уже устоявшиеся популярные компоненты:
- Работа с сетью (Networking): symfony http foundation
- Работа с базой данных (DB manager): laravel eloquent
- Безопасность HTML кода: HTML purifier
- Работа с консолью: symfony console
- Ядро кеширования (Caching): php fast cache
- Отладка (Debugging): debugBar
- Работа с почтой (Mailer): swiftmailer
- oAuth 2.0 авторизация: hybridauth
Для некоторых из используемых компонентов были написаны «потомки», расширяющие или упрощающие функциональные возможности компонента для нужд системы. Использование данных компонентов позволило достаточно упростить базовое ядро системы и снизить порог вхождения для других разработчиков.
Производительность и совместимость
А не ввести ли нам поддержку php-5.2 и не юзнуть ли polyfill? Нет, нет и еще раз нет. Сейчас, на волне выхода php 7.1 и движения к deprecated 5.5 нет абсолютно никакого смысла поддерживать устаревшие версии php. Соблазн использовать polyfill, конечно, велик, но и от него можно отказаться дабы не усложнять и без того непростую систему.
FFCMS 3 будет работать на любом интерпретаторе php начиная с версии 5.5, в связке nginx — php-fpm, apache2 — php или любыми другими связками (при условии переписания правил перезаписи uri).
Производительность системы существенно не пострадала, хотя расход ресурсов стал несколько большим, чем во 2ой версии (оно и не мудрено), но все же до уровня bitrix дотянуть не удалось. Загрузка страницы все так же < 0.1сек, потребление памяти — < 7mb (для php 5.6 без opcache). Последний performance тест можно найти на google.docs вместе с тестовым контейнером под virtualbox.
Шаблонизация (или голый php?)
В данном споре бойцы сломали немало мечей, но единого мнения в вопросе нет. Многие считают, что самого синтаксиса php вполне достаточно для шаблонизации, а некоторые без twig и blade не видят своей жизни. Во 2ой версии системы использовался twig, но мной было принято решение ограничиться классическим php синтаксисом для генерации html кода в представлениях.
// экшен контроллера:
public function actionIndex()
{
// blablabla
return $this->view->render('dir/file', [
'param' => 'my value'
]);
}
// вьюшка
<h1>Demo view</h1>
<p>param value is: <?= $param ?>
С UI осталось все по прежнему — jquery & bootstrap вполне проверенная временем связка.
БД, запросы и ActiveRecords
Для взаимодействия с базой данных в рамках PHP существует множество различных путей. Кто то работает с голым PDO, кто то с Doctrine и QueryBuilder'ами. В FFCMS используется библиотека laravel eloquent, которая позволяет взаимодействовать с базой данных по средствам сборщика запросов (Query builder) а так же при помощи подхода ActiveRecords.
ActiveRecords очень удобны для работы с БД и существенно упрощает и сокращает синтаксис запросов. Конечно, это не полноценный ORM уровня Doctrine, однако для целей CMS его вполне достаточно.
Миграции
Без миграций и их дальнейшего «деплоя» сейчас никуда. Нет, есть конечно же люди использующие mysqldump/pg_dump но мы не будем следовать этим путем. В ffcms 3 присутствует стандартная реализация миграций — классы с 3мя методами up(), seed() и down(), возможность создания, применения и отката миграций. Стандартные миграции хранятся в /Private/Migrations, но при помощи MigrationsManager могут быть имплементированы миграции из любых директорий.
Отладка
Для удобства быстрой отладки и профилирования запросов в ffcms встроен функционал phpdebugbar. Данный механизм позволяет выполнять отладку «на скорую руку», когда нет возможности или времени на подключение xdebug/zenddebug. Отладчик выглядит в виде панели и доступен для включения в настройках админ панели.
Тестирование
Тестирование работоспособности продукта вручную не является тенденцией современной разработки. Для целей автоматического тестирования кода системы и UI была внедрена система автоматических тестов — codeception, которая сочетает в себе стандартное unit-тестирование и acceptance тестирование интерфейсов.
Тесты можно запустить из корня при помощи команды codecept run, предварительно запустив selenium с драйвером для chrome или другого браузера. Так же необходимо отредактировать конфиг тестового окружения (/tests/acceptance.suite.yml) под вашу прослойку. Для настройки тестов есть небольшой документ с инструкциями к применению (документ не был изначально предназначен для «всех глаз», уж простите).
Расширения
В виду наличия PSR-0 автозагрузки система расширений была пересмотрена. Сейчас все расширения разделены на 2 типа — приложения и виджеты, первые — занимают определенный корневой URI в зависимости от контроллера и при помощи actions обрабатывают те или иные запросы; вторые — предназначены для отображения в каком-либо месте представлений путем прямого обращения к классу виджета.
Кроме того, весь набор «реализаций» может быть завернут в один пакет и при помощи git-а и composer-а соблюдая стандарт автозагрузки может распространятся как самодостаточная реализация. Ярким примером является реализация форума или демо-пакет.
Что ж, мой рассказ достаточно затянулся, но пожалуй в одну статью все уместить невозможно. Буду рад ответить на ваши вопросы и выслушать ваши пожелания.
→ Официальный сайт: ffcms.org (зеркало: ffcms.ru)
→ Проект на github: phpffcms
→ Документация администратора и разработчика: doc.ffcms.ru (в процессе доработки).
Автор: FFCMS