31 August 2010

F3: маленький PHP-фреймворк с огромными возможностями

Website development


Хочу представить вашему вниманию легковесный 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;
  • Поддержка мультиязычности.


Вот так выглядит файл, который отображает приветствие на главной странице:
  1. require_once 'path/to/F3.php';
  2. F3::route('GET /','home');
  3. function home() {
  4. echo 'Hello, world!';
  5. }
  6. F3::run();

Приступаем к работе


Внимание: для работы фреймворк нуждается в версии PHP не ниже 5.3 а также в установленном и настроенном mod_rewrite!

Чтобы не делать данное руководство слишком громоздким я решил избежать написания дизайна и некоторых очевидных функций для нашего простого приложения — гостевой книги.

Для начала создайте базу данных любым удобным для Вас способом. В качестве БД могут выступать как SQLite/MySQL так и MongoDB. Поскольку приложение — показательное и простое, я выбираю SQLite.

В моей базе guestbook.sqlite всего одна таблица — Comments, которая содержит поля id, author и comment.

Создайте в корне Вашего приложения файл index.php и переименуйте файл htaccess в .htaccess (с точкой впереди).

Далее подключите в index.php главный и единственный файл фреймворка и определите путь к базе данных:
  1. require_once('F3/F3.php'); //подключение фреймворка
  2. F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite')); /* Инициализация подключения к БД.
  3. Внимание: если у Вас версия sqlite = 2, DSN должен выглядеть так:
  4. 'dsn'=>'sqlite2:guestbook.sqlite'
  5. */

В первом примере, где выводится сообщение Hello World Вы увидели один из способов обработки роутов (путей). На самом деле их несколько и Вы свободны выбирать:

1. Функция-обработчик роута — как в первом примере. Вторым параметром метода F3::rote() указываем функцию, которую описываем в этом же файле, в любом месте

2. Анонимная функция во втором параметре метода F3::rote():
  1. require_once 'path/to/F3.php';
  2. F3::route('GET /',function () {
  3. echo 'Hello, world!';
  4. });
  5. F3::run();

3. Статический метод класса в том же втором параметре:
  1. require_once 'path/to/F3.php';
  2. class MyClass {
  3. public static function hello() {
  4. echo 'Hello, world!';
  5. }
  6. }
  7. F3::route('GET /','MyClass::hello');
  8. F3::run();

4. Обычный метод класса:
  1. require_once 'path/to/F3.php';
  2. class MyClass {
  3. public function hello() {
  4. echo 'Hello, world!';
  5. }
  6. }
  7. $test = new MyClass;
  8. F3::route('GET /',array($test,'hello'));
  9. F3::run();

5. И наконец обработчиком может быть отдельный файл, расположенный в произвольной директории с другими такими же файлами. Директорию с файлами-обработчиками необходимо объявить в начале файла index.php, после чего можно вызывать файл-обработчик роута:
  1. //index.php:
  2. <?php
  3. require_once 'path/to/F3.php';
  4. F3::set('IMPORTS','yourpath');
  5. F3::route('GET /',(:yourfile));
  6. F3::run();
  7. //yourpath/yourfile.php
  8. <?php echo 'Hello World!'; ?>

Продолжим разработку гостевой книги. В файле index.php добавьте путь к файлам плагинов — это нам нужно для использования ORM под названием Axon, которое поставляется вместе с Fat-Free:
  1. require_once('F3/F3.php');
  2. F3::set('AUTOLOAD','autoload/'); /*установка пути к плагинам.
  3. По умолчанию папка с плагинами называется autoload.
  4. Вы можете переименовать её и вынести за пределы корня сайта для большей безопасности.*/
  5. F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));

Добавьте обработку запроса главной страницы одним из вышеописанных способов. Я выбираю первый, как самый наглядный.
  1. require_once('F3/F3.php');
  2. F3::set('AUTOLOAD','autoload/');
  3. F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
  4. F3::route('GET /','home');
  5. function home() {
  6. $comments = new Axon('comments'); //подключение к таблице comments БД
  7. $all_comments = $comments->find(); // Извлечение всех комментариев
  8. foreach ($all_comments as $comment) { /* Обход всех результатов в массиве
  9. и последуюющее их отображение. Напомню, что в данном примере
  10. я пишу минимальный код без проверок на ошибки. */
  11. echo 'Автор: '.$comment['author'].'<br />';
  12. echo 'Комментарий: '.$comment['comment'].'<br /><br />';
  13. }
  14. }

Ну вот. Отображение комментариев уже работает. Можно переходить к добавлению. Но прежде я хочу немного рассказать о шаблонах.

Путь к шаблонам устанавливается тем же методом, что и другие:
  1. F3::set('GUI','путь к шаблонам');

Передать переменную в конкретный шаблон – нельзя. Переменные в Fat-Free устанавливаются для всего приложения. Это делается с помощью уже знакомого статического метода:
  1. F3::set('переменная','значение');

Теперь эта переменная доступна везде. В HTML-коде и строковом виде её значение вызывается как {@переменная}, в PHP-коде как:
  1. F3::get('переменная');

Для вызова шаблона следует использовать метод serve:
  1. F3::serve('template.html');

Таким образом мое приложение теперь имеет вид:
  1. //index.php:
  2. <?php
  3. require_once('F3/F3.php');
  4. F3::set('AUTOLOAD','autoload/');
  5. F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
  6. F3::route('GET /','home');
  7. function home() {
  8. $comments = new Axon('comments'); //подключение к таблице comments БД
  9. $all_comments = $comments->find(); // Извлечение всех комментариев
  10. F3::set('comments',$all_comments);
  11. F3::serve('template.html');
  12. }
  13. ?>
  14. <!-- template.html -->
  15. <F3:repeat key= “{@key}” index="{@comment}" group="{@comments}">
  16. <p>{@comment.id}</p>
  17. </F3:repeat>

В данном примере видно как работает шаблонизатор Fat-Free: в цикле обрабатывается переменная, в которой содержатся все комментарии.

Следующий этап – добавление формы комментариев на страницу. Для этого, сначала опишите саму форму в файле form.html, размещенном в папке с шаблонами. В моем случае форма выглядит так
  1. <form method='post' action='{PARAMS.0}'> <!-- PARAMS.0 содержит текущий адрес -->
  2. <input type='text' name='author'/>
  3. <input type='text' name='comment'/>
  4. <input type='submit' />
  5. </form>

Далее необходимо загрузить данную форму внутри существующего шаблона главной страницы, чтобы под всеми комментариями отобразить форму. Для этого внутри шаблона template.html используйте тег шаблонизатора <F3:include href=«form.html»/>. Напомню, что файл form.html должен находиться в той же директории, что и template.html

Сейчас у Вас должен возникнуть вопрос — как обработать отправленные данные? Все просто. Объявите в файле index.php обработчик для метода POST главной страницы:
  1. require_once('F3/F3.php');
  2. F3::set('AUTOLOAD','autoload/');
  3. F3::set('DB',array('dsn'=>'sqlite:guestbook.sqlite'));
  4. F3::route('GET /','home');
  5. function home() {
  6. $comments = new Axon('comments');
  7. $all_comments = $comments->find();
  8. F3::set('comments',$all_comments);
  9. F3::serve('template.html');
  10. }
  11. F3::route('POST /','savecomment');
  12. function savecomment() {
  13. $comments = new Axon('comment');
  14. $comments->copyFrom('REQUEST'); /* Если названия полей формы
  15. соответствуют названиям полей таблицы,
  16. нет необходимости присваивать каждое значение отдельно.
  17. Можно воспользоваться удобной функцией copyFrom
  18. и получить данные из переменной $_REQUEST */
  19. /* ...
  20. * тут добавьте обработку полученных данных
  21. */
  22. $comments->save(); // добавление в базу данных
  23. $F3::reroute('/'); // переадресация на главную страницу
  24. }
  25. ?>

Ну вот и все. Минимальная гостевая книга готова. Это заняло около 30 строк кода!

Сайт фреймворка
Загрузить последнюю версию Fat-Free
Поддержка
IRC канал на irc.freenode.net: #fatfree
Автора фреймворка зовут Bong Cosca. Тут находится его блог.
Tags:php5.3phpphp frameworkhigh performancemongodb
Hubs: Website development
+132
24.8k 388
Comments 102