Пишем свой блог с фреймворком Fat-Free Framework

Original author: Richard
  • Translation
  • Tutorial
На всякий случай — это перевод (многие не замечают этого в интерефейсе ХабраХабра).
«Fat-Free» можно перевести с английского как «Обезжиренный» — фреймворк и в самом деле поражает своим размером (55 КБ) и скоростью работы.


Я наконец-то нашёл лёгкий и быстрый фреймворк. Он умещается в файл размером всего 55Кб и имеет множество возможностей, о которых вы можете узнать на его официальном сайте, поэтому не буду повторяться. Вместо этого я решил сделать небольшой учебник, из которого вы узнаете как сделать свой блог на этом фреймворке.
Вам понадобится PHP 5.3 на сервере. Я использовал Ubuntu 11.04 для написания этого учебника, на которую легко устанавливается эта версия. Если вы работаете на RHEL или Centos то я предлагаю заглянуть вам на IUS Community Project для получения последней версии PHP.

Установка


Скачайте Fat-Free Framework.
Fat-Free Framework работает одинаково хорошо и в корне сайта, и в подкаталоге. Я предполагаю, что вы будете использовать подкаталог, поскольку вам не нужно будет создавать отдельный сайт для этого урока.
Создайте папку с именем blog и распакуйте содержимое фреймворка в неё. Это должно выглядеть примерно так:



Поднимитесь на один уровень вверх в иерархии каталогов и установите следующие разрешения:

sudo chgrp -R www-data blog
sudo chmod -R 775 blog

Если вы используете Apache, то mod_rewrite должен быть включён. Измените .htaccess и откорректируйте RewriteBase так, чтобы он указывал на папку с блогом. Например: RewriteBase /blog.

Уже сейчас вы можете зайти в папку blog на сервере и увидеть такую страницу:



(Как только вы посетите эту страницу, будет будет создана специальная папка с кешем — не беспокоитесь об этом).

Начало


Всё что нам нужно уже есть в Fat-Free Framework.

Давайте сначала отредактируем главную страницу и создадим подключение к базе данных.

Откройте файл index.php. Закомментируйте параметр кэширования и установите уровень отладки, чтобы вам легче было заниматься разработкой:

<?php
 
require __DIR__.'/lib/base.php';
 
//F3::set('CACHE',TRUE);
F3::set('DEBUG',3);
F3::set('UI','ui/');
 
F3::run();
 
?>

Для установки соединения с базой данных добавьте следующее между командами set и run:

F3::set('DB',
	new DB(
		'mysql:host=localhost;port=3306;dbname=ИмяВашейБазыДанных',
		'ИмяПользователя',
		'Пароль'
	)
);

Все файлы пользовательского интерфейса находятся в каталоге ui — вы можете удалить welcome.htm и style.css отсюда, так как они просто используются домашней страницей по-умолчанию.

Маршрутизация


Вы должны сказать фреймворку метод запроса (GET, POST, PUT и т.д.), адрес для запроса и как ответить на этот запрос.

Маршрут для домашней страницы:

F3::route('GET /',
	function () {
	// делаем что-нибудь
	}
);

Эта безымяная функция будет содержать логику для заполнения страницы.

Для просмотра записи блога:

F3::route('GET /view/@id',
	function () {
		$id = F3::get('PARAMS["id"]');
	}
);

Это позволяет фреймворку ожидать URI-параметр и присваивает его переменной PHP в функции.

Теперь маршруты для администратора:

// Главная страница администратора
F3::route('GET /admin',
	function () {	
	}
);
 
// Страница для добавления материала
F3::route('GET /admin/add',
	function() {
	}
);
 
// Для редактирования материала
F3::route('GET /admin/edit/@id',
	function() {
		$id = F3::get('PARAMS["id"]');
	}
);
 
// Служебная для принятия запросов
F3::route('POST /admin/edit/@id','edit');
F3::route('POST /admin/add','edit');
	function edit() {
 
	}
 
// Для удаления
F3::route('GET /admin/delete/@id',
	function() {
		$id = F3::get('PARAMS["id"]');
	}
);

Обратите внимание, что мы используем одну и ту же функцию для обработки добавления и редактирования сообщений, по этому она имеет имя (остальным функциям имена можно не давать).

Модели


ORMs в Fat-Free Framework делает всю грязную работу за вас — никаких директорий, файлов или кода.

Вот SQL запрос, который создаст 2 таблицы, необходимые для этого урока:

ХабраХабр почему-то не хочет красить этот кусок — прим. перев.

CREATE DATABASE `blog` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
 
USE `blog`;
 
CREATE TABLE IF NOT EXISTS `article` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `timestamp` datetime NOT NULL,
  `title` VARCHAR(128) NOT NULL,
  `summary` VARCHAR(128) NOT NULL,
  `content` text NOT NULL,
  `author` VARCHAR(128) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
INSERT INTO `article` (`id`, `timestamp`, `title`, `summary`, `content`, `author`) VALUES
(1, '2011-07-28 02:03:14', 'Hello World!', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut ', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', 'Mr White'),
(2, '2011-07-28 02:03:14', 'More Hello World!', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut ', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', 'Mr Green');
 
CREATE TABLE IF NOT EXISTS `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
INSERT INTO `user` (`id`, `name`, `password`) VALUES
  ('1', 'admin', 'password');


Для посетителей


Теперь нам необходимо создать экземпляр объекта Axon, чтобы получить массив результатов. Также мы установим полученное значение в переменную articles.

	$article=new Axon('article');
	$articles=$article->afind();
	F3::set('articles',$articles);

Вы бы могли объединить последнии 2 строчки в одну F3::set('articles',$article->afind());, но для удобства я оставил две.

Для использования шаблонов нужно создать базовый файл макета в папке ui с именем layout.html:

<!DOCTYPE html>
<html>
   <head>
      <title>{{@html_title}}</title>
      <meta charset='utf8' />
   </head>
   <body>
      <F3:include href="{{@content}}"/>
   </body>
</html>

Движок использует шаблон {{@имя}} для получения значения переменной.

Теперь создадим шаблон для главной страницы, который будет называется blog_home.html:

<p>Blog Titles</p>
<F3:repeat group="{{@list}}" value="{{@item}}">
	<p><a href="view/{{@item['id']}}">{{trim(@item['title'])}}</a> by {{@item['author']}}</p>
	<p>{{@item['summary']}}</p>
</F3:repeat>

Теперь, когда шаблон готов, мы можем завершить код в index.php для его отображения:

	F3::set('content','blog_home.html');
	echo Template::serve('layout.html');

Шаблон для ускорения работы приложения будет переделан движком в php код.

Полный пример будет выглядеть так:

F3::route('GET /',
	function () {
		F3::set('html_title','Home Page');
		$article=new Axon('article');
		F3::set('list',$article->afind());
		F3::set('content','blog_home.html');
		echo Template::serve('layout.html');	
	}
);

Теперь мы дожны сделать страницу, на которой будет находиться полный текст записи:

F3::route('GET /view/@id',
	function () {
		$id = F3::get('PARAMS["id"]');
		// создаём объект Axon и ищем в нём наш id
		$article=new Axon('article');
		$article->load("id='$id'");
		// устанавливаем переменные для шаблона
		F3::set('html_title',$article->title);
		$article->copyTo('POST');
		// подключаем сам шаблон
		F3::set('content','blog_detail.html');
		echo Template::serve('layout.html');
	}
);

Шаблон страницы будет находиться в файле blog_detail.html:

<h1>{{@POST.title}}</h1>
<p>Published: {{@POST.timestamp}} by {{@POST.author}}</p>
{{@POST.content}}
<p><a href='../'>Back to Homepage</a></p>

Для администратора


На главной странице администратора будут отображаться записи также, как и на главной. По этому код похожий:

F3::route('GET /admin',
	function () {
		F3::set('html_title','My Blog Administration');
		$article=new Axon('article');
		$list=$article->afind();
		F3::set('list',$list);
		F3::set('content','admin_home.html');
		echo Template::serve('layout.html');	
	}
);

Шаблон хранится в файле admin_home.html:

<!--перевёл этот шаблон, чтобы было понятнее-->
<h1>Панель администратора</h1>
<p><a href='admin/edit'>Добавить запись</a></p>
<table>
  <thead>
    <tr>
      <th>Заголовок</th>
      <th>Дата</th>
      <th>Автор</th>
      <th colspan='2'>Управление</th>
    </tr>
  </thead>
  <tbody>
  <F3:repeat group="{{@list}}" value="{{@item}}">
    <tr>
      <td>{{@item['title']}}</td>
      <td>{{@item['timestamp']}}</td>
      <td>{{@item['author']}}</td>
      <td><a href="admin/edit/{{@item['id']}}">Изменить</a></td>
      <td><a href="admin/delete/{{@item['id']}}">Удалить</a></td>
    </tr>
  </F3:repeat>
  </tbody>
</table>

Результат будет примерно такой:



Теперь создадим форму для редактирования и добавления записей в файле admin_edit.html:

<h1>Edit</h1>
<form name="blog" method="post" action="{{ @BASE }}{{ @PARAMS.0 }}" >
  <F3:check if="{{ @message }}">
    <p><span class="fail">{{ @message }}</span></p>
  </F3:check>
  <label for='title'>Title: </label><br /><input type="text" name="title" id="title" value="{{ htmlspecialchars(@POST.title) }}" size="60"/><br />
  <label for='author'>Author: </label><br /><input type="text" name="author" id="author" value="{{ htmlspecialchars(@POST.author) }}" size="60"/><br />
  <label for='summary'>Summary: </label><br /><textarea name="summary" id="summary" cols="60" rows="10">{{ htmlspecialchars(@POST.summary) }}</textarea><br />
  <label for='content'>Content: </label><br /><textarea name="content" id="content" cols="60" rows="10">{{ htmlspecialchars(@POST.content) }}</textarea><br />
  <input type="submit" value="Submit"/>
</form>

Обратите внимание, что есть области для отображения проверки сообщений.

Теперь код для маршрутов:

F3::route('GET /admin/add',
	function() {
		F3::set('html_title','My Blog Create');
		F3::set('content','admin_edit.html');
		echo Template::serve('layout.html');
	}
);
 
F3::route('GET /admin/edit/@id',
	function() {
		F3::set('html_title','My Blog Edit');
		$id = F3::get('PARAMS["id"]');
		$article=new Axon('article');
		$article->load("id='$id'");
		$article->copyTo('POST');
		F3::set('content','admin_edit.html');
		echo Template::serve('layout.html');
	}
);

Теперь напишем функцию для редактирования, о которой писалось ранее:

	function edit() {
		// Reset previous error message, if any
		F3::clear('message');
		$id = F3::get('PARAMS["id"]');
		$article=new Axon('article');
		//load in the article, set new values then save
		//if we don't load it first Axon will do an insert instead of update when we use save command
		if ($id) $article->load("id='$id'");
		//overwrite with values just submitted
		$article->copyFrom('POST');
		//create a timestamp in MySQL format
		$article->timestamp=date("Y-m-d H:i:s");
		$article->save();
		// Return to admin home page, new blog entry should now be there
		F3::reroute('/admin');
	}

Аутентификация


Добавьте следующие строчки:

// сообщаем фреймворку таблицу с пользователями и передаём значения
F3::set('AUTH',array('table'=>'user','id'=>'name','pw'=>'password'));

$auth = Auth::basic('sql');
// вход удачный
if ($auth) {
  // сохраняем в сессии
  F3::set('SESSION.user',$auth->name);
  // отображаем страницу администратора
  F3::set('content','admin_home.html');
} else {
  // вход неудачный
	F3::set('content','security.html');
}

security.html может выглядеть так:

<p>You must supply valid login details.</p>


Ещё добавьте строчку перед Template::serve:

if (!F3::get('SESSION.user')) F3::set('content','security.html');

Вот и всё. Вы также можете перенаправить пользователя на главную страницу:

if (!F3::get('SESSION.user')) F3::reroute('/');

Итог


Вот так просто можно написать блог с панелью администратора и базой данных.

Скачать готовый пример можно тут — blog.zip
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 74

    +4
    Надо будет «пощупать», радует такая легкость.
      +1
      Мне тоже очень понравилось. Простой, удобный, всё кеширует сам, без напоминаний. Смущает только предпоследний абзац — для коммерческого использования нужно «поговорить с разработчиками». Впрочем, для себя любимого можно использовать GPL.
        +3
        silex тоже простой. Насчет легкости не знаю, не профилировал еще.
          +1
          Поддерживаю silex. Неоднократно использовал — очень гибкий, расширяемый, но в тоже время простой микро-фреймворк
          +2
          Ужас, с таким обилием фреймворком на php, нужно писать разработчикам? Нет, спасибо.
        0
        Не нашел Русской поддержки, надо будет с авторами связаться, и возможно можно будет создать сообщество на Русском.
          0
          Хорошая идея. Блог для сообщества уже есть.
          –19
          Как хорошо же писать на рельсах…
            +1
            Когда-то пробовал работать с ними. Очень испугала скорость, а точнее её отсутствие. Хотя, может, я то-то не так делал…
              +3
              Так же столкнулся с проблемой скорости. Возможно конечно нужно оптимизировать как-то, но знаете тот же PHP из коробки не такой уж медленный…
                +3
                Самая простая оптимизация — продакшен запускать в режиме production, а не development.
              –8
              Кто-нить из минусовавших может объяснить минус?
              На рельсах подобное за 5 минут пишется. Смысл столько с этим возиться?
                +5
                Подобное да, а шаг вправо-шаг влево уже критичнее.
                  +4
                  Рельсы менее расширяемы чем F3? Да вы что?
                  +23
                  Кому какая разница как это пишется на рельсах? Блог о PHP и статья о php-фреймворке, зачем лишний раз разводить холивар?
                    +18
                    На рельсах подобное за 5 минут пишется. Смысл столько с этим возиться?

                    А на WordPress блог делается за 30 секунд. Вывод — WordPress хуже RoR?
                      +1
                      Спеллфикс: «Вывод — WordPress лучше RoR?»
                  –5
                  Ну вот твиттер, например, изначально на рельсах был и ничего, вполне себе шустро
                    +7
                    Я ж не спорю. Ещё GitHub шустрый на рельсах. Наверное, покрутить какой-нибудь регулятор тормознутости надо.

                    А вообще вы странные люди — зайти в блог PHP и писать какой хороший Ruby On Rails :-)
                      +1
                      Так я еще и на PHP могу)
                        +2
                        А разве это что-то меняет? На Хабре есть блог, посвящённый рельсам. Идите ещё там напишите какой PHP хороший, ласковый и милый.
                          +23
                          Интересно, PHP = Руби На Рельсах =))
                        +1
                        Ничего там шустрого не было. Fail Whale на каждое меди-событие. Правда, там смешались в кучи кони, люди и RoR виноват и сами разработчики
                        +5
                        Вопрос к уважаемым читателям: вам было интереснее в этом посте прочитать «А как у них сделано», «А что за подход» и «А как там интересно роутеры делаются» или всё таки «Угу, хорошая система, буду использовать»?
                          +4
                          Хмм… Я уж было удивился, но… 55 килобайт — без шаблонизатора и ORM, только ядро.
                            +5
                            Приходилось сталкиваться с этим чудо фреймворком, показалось недостаточно функционала.
                            Оттолкнули мелки порблемы, как отсутсвие экранирования имен полей в «ORM» (на самом деле data mapper а не полноценная реляционная проекция), отсутствие внятных механизмов фильтрации входящих данных, плюшек упрощающих работу Autoloader и т.п Одним словом прост и быстр, но писать на нем что-то более серьезное, чем свою домашнюю страничку не стал бы.
                              +2
                              От ORM там только название.
                                0
                                Они ни на что не претендуют со своим ORM, просто несколько ускоряют работу для простых таблиц и view. И честно предупреждают, что join не делают. А если вам это надо — можете легко подключить вашу любимую ORM.
                                +6
                                «Пишем свой блог с фреймворком»

                                Может не совсем в тему, но напомнило мне один тред со stackoverflow: Why does every man and his dog want to code a blogging engine?
                                  +4
                                  Присоединюсь к первому комментарию по ссылке — это очень хороший Hello, World! для любого фреймворка.
                                    0
                                    «Writing a blog engine is the new Hello World» воистину! :)
                                  +5
                                  По сабжу:

                                  $id = F3::get('PARAMS[«id»]');
                                  // создаём объект Axon и ищем в нём наш id
                                  $article=new Axon('article');
                                  $article->load(«id='$id'»);

                                  Приведение к типу int делается автоматом?
                                  SQL-инъекции случаем не будет? Используется prepared statements или что?

                                  Шаблоны со smarty-подобным синтаксисом… хм… это как-то не очень хорошо. php сам по себе отличный шаблонизатор, зачем мутить что-то ещё?
                                    +2
                                    Пхп отличный шаблонизатор, поэтому в слое вью на нем так и хочется забабахать какую-нибудь логику из контроллера. Это причина, по которой лично я начал использовать шаблонизаторы.
                                      0
                                      Когда я начал использовать шаблонизатор, логика, относящаяся к view, стала образовываться в контроллерах, а шаблоны — плодиться в огромных количествах. В результате решил использовать PHP в качестве шаблонизатора. Опомнился я совсем недавно, и вот — сейчас продолжаю все переделывать.
                                      +1
                                      Чтоб не вызывать постоянно htmlspecialchars? Чтобы без заморочек использовать наследование шаблонов? Чтобы исключить возможность обращения к всем объектам, методам и переменным, кроме явно заданных?
                                      • UFO just landed and posted this here
                                          +1
                                          Ну, написали бы почему. Да, можно решить, и даже, наверное изолировать данные представления от всего остального приложения можно (что-то было на хабре на эту тему), но других причин я не вижу. Не считать же всерьез, что синтаксис Smarty или Twig для верстальщика качественно проще синтаксиса самого PHP? А вот чтобы очень умный верстальщик не начал базу в шаблоне дергать — по-моему, очень веская причина использования шаблонизаторов, не дающих коду в шаблоне доступ к глобальному контексту. «Из коробки» такой функциональности в PHP сейчас точно нет и, вроде, в 5.4 не предвидится.
                                            0
                                            Вообще да было бы приятно какой-нибудь способ избавления от переменных и контекста придумать.
                                        +1
                                        И меня тоже это интересует.
                                        Какова скорость работы конструкции $id = F3::get('PARAMS[«id»]');, видимо это хэш?
                                        Как уже сказали, вы приводите пример, и в тоже время всем на обозрение выставляете SQL-инъекцию.
                                        +1
                                        Прямо bottlepy для PHP
                                          +1
                                          Лёгкость это, конечно, хорошо, но зачем же столько статических методов-то?
                                            +1
                                            А чтоб легкость обеспечить :) Передавать экземпляр F3 во все места, где он может понадобится легкости не добавит, делать глобальной переменной его или синглтоном тоже читаемость и объём кода не уменьшит. В принципе и недостатков в данном случае особых нет у статических методов. И инстанцирование никаких плюсов не даст, т. к. заменять или расширять класс F3 вряд ли понадобится.
                                              0
                                              Вопрос зачем столько регулярок и зачем всё сунуть в одну статическию переменную эмулирующую GLOBALS. Реальное приложение просто падает в корку под нагрузкой.
                                              Да и в целом, подход на сантиметр длиннее голого php, а местами даже короче.
                                              +1
                                              Честно говоря, удивила первая же строка:

                                              require __DIR__.'/lib/base.php';
                                              


                                              Не проще ли было написать вот так:

                                              require './lib/base.php';
                                              
                                                0
                                                Не ожидаете же, надеюсь, что текущим каталогом в начале исполнения будет не каталог скрипта?
                                                  0
                                                  Впрочем, я понимаю, что это перевод и он должен быть точен. Но не понимаю, что имел в виду автор первоисточника.
                                                    +1
                                                    Помниться мне, абсолютные пути лучше чем относительные… чем — не могу сказать, были какие-то аправдания что быстрее подключаются файлы, но я просто превык. Все в моем отделе так пишут… а я чем хуже? Да и проблем особо пока не встречал.
                                                      +1
                                                      Черт. Опять опечатки… Ну вот как проснуться?
                                                    0
                                                    Не ожидаете же, надеюсь, что текущим каталогом в начале исполнения будет не каталог скрипта

                                                    Мне кажется, дело в том, что тяжело быть уверенным в корректности include path. Возможно, проблема аналогична той, что нельзя использовать $_SERVER['DOCUMENT_ROOT'], так как на разных конфигурациях в нём может быть некорректное значение.

                                                    Я всегда стараюсь сделать в инициализонном файле что-то типа:
                                                    define( 'ROOT', __DIR__ );
                                                    

                                                    А потом уже использовать константу ROOT для подключения файлов.
                                                      0
                                                      Мне кажется, дело в том, что тяжело быть уверенным в корректности include path.
                                                      Позвольте тотчас же без обиняков сообщить Вам, что официальное пособие чёрным по белому гласит: include_path вовсе не используется, когда задан абсолютный (от «/» в Unix, от «\» в Windows), или относительный (от «./» или от «../») путь к подключаемому файлу.

                                                      (И так как в моём примере «./lib/base.php», то include_path не при делах.)
                                                        +1
                                                        Странная ссылка. Описан костыль, но вот причина его появления упомянута вскользь. Может дело в неправильной конфигурации «our new linux server»? Помню сталкивался с похожим когда только начинал использовать nginx.
                                                          +1
                                                          Ага. Вполне возможно, что неправильно сконфигурирован пых или ось. Тем не менее, в общим примерах желательно воздержаться от DOCUMENT_ROOT, ведь у пользователя тоже может быть неправильно сконфигурировано что-то, тем более он не так уж и нужен.
                                                      0
                                                      Относительные пути и так разворачиваются в абсолютные. Этого, как минимум, требует логика работы require_once/include_once. Желание помочь интерпретатору и не делать лишний системный вызов?
                                                      +1
                                                      Зашел в документации в раздел «Forms Handler», а там такой шаблон:

                                                      {{@message}}

                                                      Как-то некрасиво совсем…
                                                        0
                                                        хабр скушал код:)
                                                        короче, пример некрасивого шаблона с самого верху на fatfree.sourceforge.net/page/forms-handler
                                                          0
                                                          Дабы парсер Хабрахабра не кушал Ваш код, используйте пару тегов <source></source> для обрамления блоков исходного кода, и тем невозбранно достигнете желаемого.
                                                            –1
                                                            Кушались символы «больше» и «меньше». Оказывается, их тут надо писать html-кодом &gt; и &lt;
                                                            Результат: > и < :)
                                                            0
                                                            А что не нравится?
                                                              0
                                                              Ну, по-моему шаблонизатор должен облегчать жизнь, а не усложнять. В шаблонизаторе F3 даже по сравнению с нативным php синтаксис запутаннее…
                                                              Сравните:
                                                              <F3:check if="{{!is_null(@message)}}">
                                                              {{@message}}
                                                              </F3:check>
                                                              и
                                                              <?php if (!empty($message)):?>
                                                              <?=$message?>
                                                              <?php endif?>
                                                                0
                                                                Я как-то привык на синтаксис внимания не обращать :) А тут, похоже, ноги от XSLT растут или схожих идей.
                                                          +6
                                                          Мне, из микро-фреймворков на PHP, больше всего радует Silex.
                                                            0
                                                            habrahabr.ru/blogs/symfony/118011/ — обзор на хабре для заинтересовавшихся.
                                                              0
                                                                0
                                                                Там во многих примерах используется Symfony — т.е. к «микрофреймворку» нужно таскать огромную библиотеку вспомогательных функций? :)
                                                                  0
                                                                  Используются компоненты Symfony2, специально заточенные под использование без ядра Symfony2 (часть из них я постепенно ввожу в старые проекты, чтобы не изобретать заменить свои велосипеды). Весь фреймворк (вместе с компонентами) — один файл меньше полмегабайта — таскать можно на дискете :) Правда ORM «из коробки» нет, только DBAL.
                                                                0
                                                                Буквально пару недель назад начал в очередной раз просматривать фреймворки, требования простые живой, нормальное комьюнити + документация, несколько полезных функций «из коробки» (кеширование, роутинг, работа с БД и т.п.). Среди них был и F3. Покрутил разные, «то то не то»-«то там не так», и все-таки пришел к Yii Framework. Достаточно быстрый и очень широкое применение + еще и обрадовало сообщение от 1 января на Habrahabre — обновился до 1.1.9. И да, это был первый фремйворк, где захотелось участвовать в opensource.
                                                                  +1
                                                                  Yii это все таки другой класс. Нет смысл сравнивать микрофреймворк F3, с полноценным фреймворком Yii.
                                                                    0
                                                                    Абсолютно поддерживаю.
                                                                    От себя добавлю, что кроме микро (F3) и миди (CI, Yii, Cake) есть ещё макси (ZF2, Symphony), которые тоже с Codeigniter не очень то и сравниваются.
                                                                      0
                                                                      Symfony2 меньше трех метров, Yii 5+ — кто из них миди, а кто макси? :)
                                                                  0
                                                                  Имел дело с первой веткой.
                                                                  Полное гавно, есть пару интересных моментов, но в целом он ужасен, особенно количеством регулярок внутри. Писать на нём реальный проект глупость. Вот начинал писать обзор amdy.su/developing-by-fatfree/, ещё в планах выложить пару исходников, с заказчиком уже договорился, но руки не доходят до второй части.
                                                                    0
                                                                    Полез смотреть код, когда увидел, что шаблон url в route передается в виде строки. Поплакал)
                                                                    /**
                                                                    		Assign handler to route pattern
                                                                    			@param $pattern string
                                                                    			@param $funcs mixed
                                                                    			@param $ttl int
                                                                    			@param $throttle int
                                                                    			@param $hotlink bool
                                                                    			@public
                                                                    	**/
                                                                    	static function route($pattern,$funcs,$ttl=0,$throttle=0,$hotlink=TRUE) {
                                                                    		list($methods,$uri)=
                                                                    			preg_split('/\s+/',$pattern,2,PREG_SPLIT_NO_EMPTY);
                                                                    		foreach (self::split($methods) as $method)
                                                                    			// Use pattern and HTTP methods as route indexes
                                                                    			self::$vars['ROUTES'][$uri][strtoupper($method)]=
                                                                    				// Save handler, cache timeout and hotlink permission
                                                                    				array($funcs,$ttl,$throttle,$hotlink);
                                                                    	}
                                                                    

                                                                    Строка с разбивкой $pattern по пробельным символам и лимитом 2. Интересно, то есть они заведомо предполагают, что там будет передан метод и ссылка, так почему же не сделать было метод класса с параметрами $method, $pattern вместо $method.' '.$pattern?
                                                                    Наверно это микродзен для ускорения производительности?)
                                                                      0
                                                                      Автор, а где вы нашли про письмо разработчкиам в случае коммерческого использования?

                                                                      fatfree.sourceforge.net/page/support-licensing

                                                                      Я так понял, что для коммерческого использования возможно не использовать GNU GPL v3 и закрывать код. Может я что-то неверно понял?
                                                                        +1
                                                                        Автор, а где вы...

                                                                        Я не автор. Я — переводчик.
                                                                        Абзац про лицензию также был в оригинальном тексте и я перевёл его. Возможно, что разработчики передумали и открыли код для всех под GPL.
                                                                        На всякий случай просто уберу этот кусок из топика.
                                                                        0
                                                                        Похоже Fat Free сильно обновился, например упоминаний об Axon в свежей версии я не нашел. Вот бы кто-нибудь обновил и мануал…

                                                                        Only users with full accounts can post comments. Log in, please.