Pull to refresh
0
FFCMS
Теперь FFCMS 3 с MVC, composer, AR!

Релиз FFCMS 3.0.0 — новая переработанная система

Reading time 5 min
Views 7.9K
Доброго времени суток обитатель 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. Отладчик выглядит в виде панели и доступен для включения в настройках админ панели.

Картинка с debugbar


Тестирование


Тестирование работоспособности продукта вручную не является тенденцией современной разработки. Для целей автоматического тестирования кода системы и UI была внедрена система автоматических тестов — codeception, которая сочетает в себе стандартное unit-тестирование и acceptance тестирование интерфейсов.

Тесты можно запустить из корня при помощи команды codecept run, предварительно запустив selenium с драйвером для chrome или другого браузера. Так же необходимо отредактировать конфиг тестового окружения (/tests/acceptance.suite.yml) под вашу прослойку. Для настройки тестов есть небольшой документ с инструкциями к применению (документ не был изначально предназначен для «всех глаз», уж простите).

Мотивирующая gif-ка с выполнением тестов (5Mb!!!)


Расширения


В виду наличия PSR-0 автозагрузки система расширений была пересмотрена. Сейчас все расширения разделены на 2 типа — приложения и виджеты, первые — занимают определенный корневой URI в зависимости от контроллера и при помощи actions обрабатывают те или иные запросы; вторые — предназначены для отображения в каком-либо месте представлений путем прямого обращения к классу виджета.

Кроме того, весь набор «реализаций» может быть завернут в один пакет и при помощи git-а и composer-а соблюдая стандарт автозагрузки может распространятся как самодостаточная реализация. Ярким примером является реализация форума или демо-пакет.

Что ж, мой рассказ достаточно затянулся, но пожалуй в одну статью все уместить невозможно. Буду рад ответить на ваши вопросы и выслушать ваши пожелания.

→ Официальный сайт: ffcms.org (зеркало: ffcms.ru)
→ Проект на github: phpffcms
→ Документация администратора и разработчика: doc.ffcms.ru (в процессе доработки).
Tags:
Hubs:
+17
Comments 77
Comments Comments 77

Articles

Information

Website
ffcms.ru
Registered
Founded
Employees
1 employee (me only)
Location
Россия