Pull to refresh

phpBBex — добавляем автозагрузку классов и обработчики AJAX запросов

Reading time 4 min
Views 2K
phpBBex logophpBBex — это расширенная версия phpBB 3, которая была анонсирована ранее на Хабре. Проект постепенно развивается, появляются новые полезные возможности. Сегодня у нас появился официальный форум и вышла новая версия нашего форка.

Как известно, код phpBB 3 был заложен в далёком 2002 году. Здесь всё по-старому. Нет никаких сложных абстракций, код простой и линейный. Для небольших проектов это не проблема. Но движок оброс функциональностью, и огромную массу кода сейчас не всегда просто изменить для достижения необходимого результата. Игнорирование современных паттернов мешает дальнейшему развитию. Понятно, что разработчикам phpBB важно следить за совместимостью кода со старыми модами, поэтому никаких серьёзных архитектурных улучшений ожидать не приходится. Выходом из ситуации должен быть phpBB 4 на основе Symfony 2, но за его разработку ещё не взялись. Очевидно, переписать такого монстра не так просто, так что в ближайшее время чуда не будет.

Поскольку в phpBBex планируется множество изменений, связанных с переводом интерфейса на AJAX, логичным было бы реализовать удобный механизм для добавления новых обработчиков AJAX запросов. Стандартным способом для phpBB сегодня является создание php файла в корне со своей логикой для каждой модификации. Это не дело. Мы попробовали добавить нечто вроде контроллеров. Обработчики сгруппированы в «классы-контроллеры», имеется единая точка входа, которая создаёт экземпляр необходимого «контроллера» и вызывает соответствующий обработчик. На основе этого мы создали систему анонимной оценки комментариев (почти как на Хабре).

Автозагрузка классов


А начнём мы — с начала. Автозагрузка классов — одна из тех приятных вещей, которую мы можем совершенно безболезненно добавить. Что мы и сделали. Класс autoloader (исходный код) очень прост и переносим, его можно использовать в любом другом проекте. Требуется PHP 5.2+.

Пример использования:
require('./classes/autoloader.php');          // Подключаем файл с классом автозагрузчика
autoloader::init('./classes/');               // Инициализация, указываем основной путь поиска файлов классов
autoloader::add_path('./modules/', 'module'); // Добавляем дополнительный путь для классов с префиксом module_

Схема поиска файлов классов достаточно типична, с некоторыми нововведениями. Поиск ведётся в общем каталоге с классами, либо в специальном (если у имени класса есть какой-то особый префикс, например, module_). Общих и специальных каталогов для одного префикса может быть много. Они обходятся в порядке добавления путей статичным методом add_path.

Разыменование имени класса в путь к файлу происходит следующим образом. Имя загружаемого класса разбивается по «_» (при этом проверяемый префикс отбрасывается). Затем пока находятся каталоги с именами, совпадающими с полученными частями имени класса, путь генерируется следующим образом: part1/part2/part3/. Если вложенные каталоги закончились, оставшаяся часть используется как имя файла (например, класс db_select_query может соответствовать файлу /classes/db/select/query.php). Причём в отличие от других автозагрузчиков, там вполне может остаться несколько частей, которые будут объединены через «_» (в предыдущем примере, если каталога select не существует, будет использован файл /classes/db/select_query.php, если же не будет и каталога db, то и вовсе получится /classes/db_select_query.php). Если же все части были использованы в качестве имён каталогов, в качестве имени файла используется последняя часть, совпадающая с именем последнего каталога (например, класс db при наличии каталога db будет соответствовать файлу /classes/db/db.php).

Служебные классы


Раз уж появился автозагрузчик, глупо было бы не создать небольшую библиотеку классов с полезными функциями. Были реализованы классы arr (работа с массивами), str (работа со строками), request (работа с данными запроса), response (формирование ответа), cookie (работа с печеньками). Был реализован даже собственный роутер (класс route) — для создания и настройки человеческих урлов в phpBB. К сожалению, пока что он не задействован. Но в будущем, надеемся, всё будет. Подробная документация по этим классам также планируется. При именовании классов, методов и переменных используется стандарт кодирования phpBB (всюду нижний регистр, знак подчёркивания в качестве разделителя).

Реализация обработчиков AJAX запросов


То, что обычно в современных системах называют «контроллерами», мы назвали «модулями», потому что у phpBB нет модели, и наши обработчики напрямую работают с данными. Пожалуй, это уже никак из phpBB 3 не искоренить.

Все модули находятся в каталоге modules, имена классов модулей имеют вид module_something. Каждое действие, что может совершить модуль — это метод, который имеет префикс «action_». На данный момент это используется только для обработки AJAX запросов, поэтому точкой входа для запросов к модулям сделан файл ajax.php, который принимает параметры module и action, и передаёт управление классу core, который загружает запрошенный модуль и выполняет необходимое действие.

Оценка сообщений


Новые классы очень хотелось попробовать в деле. Реализация функции оценки сообщений — отличная возможность сделать это. Один класс, пара методов — и вот он, результат!

Внешний вид:

Настройки:


Статистика кто сколько плюсов получил, кто сколько поставил и т.д. подсчитывается, и доступна в шаблонных переменных, но по умолчанию нигде не выводится. Это сделано намеренно, чтобы оценки оказывали нейтральное влияние на атмосферу форума, и пользователи не пытались «накрутить» этот показатель. Но если кто-то не согласен — при желании все цифры легко вывести.

Что дальше?


К полученной системе модулей будет прикручен разработанный роутер, точкой входа станет единственный файл index.php. Все существующие скрипты типа viewtopic.php и др. будут оформлены в виде action-ов соответсвующих модулей. В результате получится гибкая система для настройки вида красивых URL на форуме.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+1
Comments 2
Comments Comments 2

Articles