Предыстория
В голове уже давно сидела идея, сделать проект онлайн контестера по физике, на подобии подобных систем с программирования. Но постоянно что-то мешало реализации проекта: нехватка времени, нехватка знаний, лень, и самое главное, хорошего и понятного фреймворка или CMS.
Изобретение велосипеда
Первые, конвульсивные попытки заставить себя сесть за работу выглядели печально, так как главной целью было (изначально) разработать ту самую «базовую систему», на которой потом уже делать проект. Наверное уже после третьей неудачной попытки, и осознании своей ошибки, я начал поиск простого и понятного фреймворка. Выбор пал на FatFree Framework.
Кратко о FatFree Framework aka F3
Первое знакомство началось с постов на Хабре http://habrahabr.ru/post/103167/, и http://habrahabr.ru/post/135619/ за что огромное спасибо авторам.
Не буду повторятся о том, что написано в предыдущих постах, а просто постараюсь изложить свой небольшой опыт по роботе с F3.
Планируем модульность.
Дело в том, что в F3, путь для подключения файлов задаётся следующим образом
F3::Set('INCLUDE','path/to/files');
А так как проект предполагал модульность то я рассчитывал обрабатывать роуты следующим образом:
F3::Set('INCLUDE','path/to/module-1');
F3::route('GET /module1/action1','action1.php');
F3::route('GET /module1/action2','action2.php');
...
F3::Set('INCLUDE','path/to/module-2');
F3::route('GET /module2/action1','action1.php');
F3::route('GET /module2/action2','action2.php');
Но, получилось что скрипт устанавливал только КОНЕЧНОЕ значение INCLUDE, и естественно меня посыпало ошибками.
Выход обнаружился во время перекура…
F3::Set('INCLUDE','path/to/');
F3::route('GET /module1/action1','module1/action1.php');
F3::route('GET /module1/action2','module1/action2.php');
...
F3::Set('INCLUDE','path/to/');
F3::route('GET /module2/action1','module2/action1.php');
F3::route('GET /module2/action2','module2/action2.php');
Но и со временем это решение, кануло в небытие, Зачем плодить кучу роутов в основном index.php. Как результат, конкретные роуты перебазировались в папки их модулей в файл index.php (modules/moduleN/index.php)
А в основном индекс-файле осталось только подключение модулей. Например:
//Modules
F3::call('blog/index.php');
F3::call('ftest/index.php');
F3::call('users/index.php');
Работа с БД
В предыдущих постах о F3, показывается работа с БД посредством замечательного класса Axon, которому нужно было передать название таблицы, и он возвращал двумерный массив с результатом. Изначально я думал что это круто, но когда дело дошло до сложных запросов с двух, а то и трёх таблиц, где предполагалось несколько условий?
Axon в проекте быстро заменила банальная функция
DB::sql("Select ...")
результатом которой есть массив которой возвращается с помощью
F3::get('DB->result')
Далее с помощью foreach'a или непосредственно в шаблоне с помощью <F3::repeat> не составит проблемы обработать данные.
Интересный момент. Если у нас заранее известно что результатом DB::sql(«Select ...») будет одна строка бд, то получить ассоциативный массив не составит труда
$array=F3::get('DB->result[0]')
Если же нам нужно достать например COUNT(id), можно записать так
F3::get('DB->result[0]["COUNT(id)"]')
И напоследок, ещё один момент по работе с БД: узнать индекс последней добавленной записи для текущей сессии можно так
F3::get('DB')->pdo->lastInsertId();
Безопасность.
Все возможные недочёты предусмотреть не реально. Поэтому на форуме F3 была найдена простая «заглушка» ошибок, конечно она не спасёт от преднамеренных взломов, но хотя бы скроет некоторые ошибки, и украсит их
if (F3::get('DEBUG') == 0)
F3::set('ONERROR', function ()
{
echo Template::serve('error404.html'); die(); }
);
Напоследок
Много интересного можно найти в коде F3, к тому же там куча комментариев.
Официальная документация проекта fatfree.sourceforge.net/
Как вы понимаете, весь опыт не уложится в один пост, и если где-то я неправ, прошу извинить. Спасибо.
Автор: NorthDakota
Здравствуйте, NorthDakota! Очень понравился Ваш рассказ! Приятно читать!
Тоже начинаю изучать этот фреймворк, но есть вопросы. Как с Вами можно связаться? Или напишите мне =)
ICQ: 401188652