
Хочу представить вашему вниманию легковесный PHP-фреймворк, на который я недавно наткнулся и который сразу же полюбил.
Fat-Free чем-то похож на известный Ruby-фреймворк Sinatra. Автор Fat-Free помешан на минимализме и чистоте кода, что положительно отразилось на этом простом каркасе для разработки самых разнообразных приложений.
Fat-Free состоит из одного файла и весит всего 55KB. При этом фреймворк обладает таким функционалом: специфический и довольно удобный шаблонизатор, гибкое кеширование, автоматическая защита от спама, интегрированные средства для юнит тестов, профайлер кода.
Он настолько маленький и быстрый, что даже может использоваться для контроля траффика Web-сервера.
Это, также, единственный фреймворк, который защищает Ваше приложение от хотлинкинга и DoS атак.
Неважно, новичек Вы или профессиональный PHP-программист, Fat-Free простой в использовании и одновременно мощный. Он не требует инсталяции или четкой структуры директорий. Данный фреймворк позволяет писать приложения как в объектно-ориентированном так и процедурном стилях. Философия Fat-Free и ее подход к MVC-архитектуре стремятся к минимализму структурных компонентов, избежанию сложности и балансу между элегантностью кода, производительностью приложения и продуктивностью программиста.
Fat-Free поставляется с плагинами, которые помогут расширить возможности фреймворка:
- Auto-mapping ORM под названием Axon, которое автоматически определяет поля таблицы в базе данных и создает для них соответствующие объектные переменные;
- M2 для работы с MongoDB;
- Обработчик форм;
- Генератор капч;
- Компрессор JavaScript и CSS;
- Динамический генератор XML карты сайта
- Генератор миниатюр и псевдо-изображений;
- Identicons;
- Авторизация;
- Гибкая система журналирования;
- Средства для коммуникации с другими серверами;
- Обработка ZIP архивов;
- Функции для работы с API Google, Twitter, Yahoo! и Akismet;
- Поддержка мультиязычности.
Вот так выглядит файл, который отображает приветствие на главной странице:
- require_once 'path/to/F3.php';
- F3::route('GET /','home');
- function home() {
- echo 'Hello, world!';
- }
- F3::run();
-
Приступаем к работе
Внимание: для работы фреймворк нуждается в версии PHP не ниже 5.3 а также в установленном и настроенном mod_rewrite!
Чтобы не делать данное руководство слишком громоздким я решил избежать написания дизайна и некоторых очевидных функций для нашего простого приложения — гостевой книги.
Для начала создайте базу данных любым удобным для Вас способом. В качестве БД могут выступать как SQLite/MySQL так и MongoDB. Поскольку приложение — показательное и простое, я выбираю SQLite.
В моей базе guestbook.sqlite всего одна таблица — Comments, которая содержит поля id, author и comment.
Создайте в корне Вашего приложения файл index.php и переименуйте файл htaccess в .htaccess (с точкой впереди).
Далее подключите в index.php главный и единственный файл фреймворка и определите путь к базе данных:
- require_once('F3/F3.php'); //подключение фреймворка
- F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite')); /* Инициализация подключения к БД.
- Внимание: если у Вас версия sqlite = 2, DSN должен выглядеть так:
- 'dsn'=>'sqlite2:guestbook.sqlite'
- */
В первом примере, где выводится сообщение Hello World Вы увидели один из способов обработки роутов (путей). На самом деле их несколько и Вы свободны выбирать:
1. Функция-обработчик роута — как в первом примере. Вторым параметром метода F3::rote() указываем функцию, которую описываем в этом же файле, в любом месте
2. Анонимная функция во втором параметре метода F3::rote():
- require_once 'path/to/F3.php';
- F3::route('GET /',function () {
- echo 'Hello, world!';
- });
- F3::run();
3. Статический метод класса в том же втором параметре:
- require_once 'path/to/F3.php';
- class MyClass {
- public static function hello() {
- echo 'Hello, world!';
- }
- }
- F3::route('GET /','MyClass::hello');
- F3::run();
4. Обычный метод класса:
- require_once 'path/to/F3.php';
- class MyClass {
- public function hello() {
- echo 'Hello, world!';
- }
- }
- $test = new MyClass;
- F3::route('GET /',array($test,'hello'));
- F3::run();
5. И наконец обработчиком может быть отдельный файл, расположенный в произвольной директории с другими такими же файлами. Директорию с файлами-обработчиками необходимо объявить в начале файла index.php, после чего можно вызывать файл-обработчик роута:
- //index.php:
- <?php
- require_once 'path/to/F3.php';
- F3::set('IMPORTS','yourpath');
- F3::route('GET /',(:yourfile));
- F3::run();
- //yourpath/yourfile.php
- <?php echo 'Hello World!'; ?>
Продолжим разработку гостевой книги. В файле index.php добавьте путь к файлам плагинов — это нам нужно для использования ORM под названием Axon, которое поставляется вместе с Fat-Free:
- require_once('F3/F3.php');
- F3::set('AUTOLOAD','autoload/'); /*установка пути к плагинам.
- По умолчанию папка с плагинами называется autoload.
- Вы можете переименовать её и вынести за пределы корня сайта для большей безопасности.*/
- F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
Добавьте обработку запроса главной страницы одним из вышеописанных способов. Я выбираю первый, как самый наглядный.
- require_once('F3/F3.php');
- F3::set('AUTOLOAD','autoload/');
- F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
- F3::route('GET /','home');
- function home() {
- $comments = new Axon('comments'); //подключение к таблице comments БД
- $all_comments = $comments->find(); // Извлечение всех комментариев
- foreach ($all_comments as $comment) { /* Обход всех результатов в массиве
- и последуюющее их отображение. Напомню, что в данном примере
- я пишу минимальный код без проверок на ошибки. */
- echo 'Автор: '.$comment['author'].'<br />';
- echo 'Комментарий: '.$comment['comment'].'<br /><br />';
- }
- }
Ну вот. Отображение комментариев уже работает. Можно переходить к добавлению. Но прежде я хочу немного рассказать о шаблонах.
Путь к шаблонам устанавливается тем же методом, что и другие:
- F3::set('GUI','путь к шаблонам');
Передать переменную в конкретный шаблон – нельзя. Переменные в Fat-Free устанавливаются для всего приложения. Это делается с помощью уже знакомого статического метода:
- F3::set('переменная','значение');
Теперь эта переменная доступна везде. В HTML-коде и строковом виде её значение вызывается как {@переменная}, в PHP-коде как:
- F3::get('переменная');
Для вызова шаблона следует использовать метод serve:
- F3::serve('template.html');
Таким образом мое приложение теперь имеет вид:
- //index.php:
- <?php
-
- require_once('F3/F3.php');
- F3::set('AUTOLOAD','autoload/');
- F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
-
- F3::route('GET /','home');
- function home() {
- $comments = new Axon('comments'); //подключение к таблице comments БД
- $all_comments = $comments->find(); // Извлечение всех комментариев
- F3::set('comments',$all_comments);
- F3::serve('template.html');
- }
-
- ?>
-
- <!-- template.html -->
-
- <F3:repeat key= “{@key}” index="{@comment}" group="{@comments}">
- <p>{@comment.id}</p>
- </F3:repeat>
В данном примере видно как работает шаблонизатор Fat-Free: в цикле обрабатывается переменная, в которой содержатся все комментарии.
Следующий этап – добавление формы комментариев на страницу. Для этого, сначала опишите саму форму в файле form.html, размещенном в папке с шаблонами. В моем случае форма выглядит так
- <form method='post' action='{PARAMS.0}'> <!-- PARAMS.0 содержит текущий адрес -->
- <input type='text' name='author'/>
- <input type='text' name='comment'/>
- <input type='submit' />
- </form>
Далее необходимо загрузить данную форму внутри существующего шаблона главной страницы, чтобы под всеми комментариями отобразить форму. Для этого внутри шаблона template.html используйте тег шаблонизатора <F3:include href=«form.html»/>. Напомню, что файл form.html должен находиться в той же директории, что и template.html
Сейчас у Вас должен возникнуть вопрос — как обработать отправленные данные? Все просто. Объявите в файле index.php обработчик для метода POST главной страницы:
- require_once('F3/F3.php');
- F3::set('AUTOLOAD','autoload/');
- F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
-
- F3::route('GET /','home');
- function home() {
- $comments = new Axon('comments');
- $all_comments = $comments->find();
- F3::set('comments',$all_comments);
- F3::serve('template.html');
- }
-
- F3::route('POST /','savecomment');
- function savecomment() {
- $comments = new Axon('comment');
- $comments->copyFrom('REQUEST'); /* Если названия полей формы
- соответствуют названиям полей таблицы,
- нет необходимости присваивать каждое значение отдельно.
- Можно воспользоваться удобной функцией copyFrom
- и получить данные из переменной $_REQUEST */
-
- /* ...
- * тут добавьте обработку полученных данных
- */
-
- $comments->save(); // добавление в базу данных
- $F3::reroute('/'); // переадресация на главную страницу
- }
- ?>
Ну вот и все. Минимальная гостевая книга готова. Это заняло около 30 строк кода!
Сайт фреймворка
Загрузить последнюю версию Fat-Free
Поддержка
IRC канал на irc.freenode.net: #fatfree
Автора фреймворка зовут Bong Cosca. Тут находится его блог.