Fat-Free Фреймворк — полное описание

fat-treeСегодня представляем вашему вниманию мощный, но простой в использовании микро-фреймворк PHP, разработанный, для того чтобы помочь вам быстро создавать динамичные и надежные веб-приложения!

Сжатый в одном файле размером ~ 65 КБ, F3 (как мы его с любовью называем) дает вам прочную основу, развитую базу кода и безошибочный подход к написанию веб-приложений. Под капотом находится простой в использовании набор инструментов для веб-разработки, высокопроизводительный механизм маршрутизации и кэширования URL-адресов, встроенная подсветка кода и поддержка многоязычных приложений. Это легкий, простой в использовании и быстрый. Больше всего, это не мешает вам.

Будь вы новичок или опытный программист PHP, F3 поможет вам в кратчайшие сроки. Нет ненужных и кропотливых процедур установки. Не требует сложной конфигурации. Нет запутанных структур каталогов. Нет лучшего времени, чтобы начать разработку веб-приложений проще, чем сейчас!

F3 поддерживает готовые базы данных SQL и NoSQL: MySQL, SQLite, MSSQL / Sybase, PostgreSQL, DB2 и MongoDB. Он также поставляется с мощными объектно-реляционными сопоставителями для абстракции и моделирования данных, которые так же легки, как и фреймворк. Конфигурация не требуется.

Это не все. F3 поставляется с другими дополнительными плагинами, которые расширяют его возможности:

Быстрый и чистый шаблонный движок,
Инструментарий модульного тестирования,
Сеансы под управлением базы данных с автоматической защитой CSRF,
Конвертер Markdown-to-HTML,
Atom / RSS-ридер,
Процессор изображений,
Обработчик геоданных,
Google статические карты,
Компрессор Javascript / CSS на лету,
OpenID (потребитель),
Пользовательский регистратор,
Корзина / Корзина,
Pingback сервер / потребитель,
Строковые функции с поддержкой Юникода,
SMTP через SSL / TLS,
Инструменты для общения с другими серверами,
И конечно же в крошечной упаковке с наддувом!

В отличие от других платформ, F3 стремится быть пригодным для использования — не обычно.

Flattr этот проект

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

Оглавление:

Начнем от печки
Как выполняется маршрутизация
Рамочные переменные
Представления и шаблоны
Базы данных, подключение и использование
Плагины и их использование
Оптимизация или чтобы еще подкрутить?
Модульное тестирование
Краткий справочник движка
Поддержка и лицензирование

Версия 3.6 наконец выпущена!

Последний официальный релиз встречает новый год с новой силой и знаменует собой последний рубеж в этой версии Fat-Free Framework. Версия 3.6 с потрясающими новыми функциями и выдающейся документацией, которая потребовала значительного времени и усилий для разработки и совершенствования, теперь доступна для загрузки. Это издание содержит множество новых функций удобства и безопасности.

F3 имеет стабильную архитектуру корпоративного класса. Непревзойденная производительность, удобные функции и легкая площадь. О чем вы еще хотите попросить?

Настоятельно рекомендуется, чтобы опытные пользователи разрабатывали новые приложения с этой версией, чтобы воспользоваться преимуществами новейшей кодовой базы и ее значительными улучшениями.
Представляем FatFreeFramework.com

Подробную документацию по API с большим количеством примеров кода и графическое руководство теперь можно найти по адресу http://fatfreeframework.com/ .

Конечно, этот удобный онлайн-справочник работает на F3! Он демонстрирует возможности и производительность фреймворка. Проверьте это сейчас.
Начиная

Дизайнер знает, что достиг совершенства не тогда, когда нечего добавить, а когда нечего убрать. — Антуан де Сент-Экзюпери

Fat-Free Framework позволяет легко создавать целые веб-сайты в один миг. Обладая той же мощью и краткостью, что и современные наборы инструментов и библиотек Javascript, F3 помогает вам писать более привлекательные и надежные программы на PHP. Один взгляд на ваш исходный код PHP, и любой поймет, как легко понять, как много вы можете сделать за несколько строк кода и насколько эффективны результаты.

F3 — одна из лучших документированных сред. Обучение это стоит почти ничего. Нет строгого набора сложных для навигации структур каталогов и навязчивых шагов программирования. Не нужно загружать параметры конфигурации, чтобы отобразить ‘Hello, World’ в вашем браузере. Fat-Free дает вам большую свободу — и стиль — чтобы выполнять больше работы с легкостью и за меньшее время.

Декларативный подход F3 к программированию облегчает как новичкам, так и экспертам понимание кода PHP. Если вы знакомы с языком программирования Ruby, вы заметите сходство между Fat-Free и микро-фреймворком Sinatra, поскольку они оба используют простой предметно-ориентированный язык для веб-сервисов ReSTful. Но в отличие от Sinatra и его PHP-воплощений (Fitzgerald, Limonade, Glue и многие другие), Fat-Free выходит за рамки простой обработки маршрутов и запросов.

Представления могут быть в любой форме, такой как простой текст, HTML, XML или сообщение электронной почты. Фреймворк поставляется с быстрым и простым в использовании механизмом шаблонов. F3 также без проблем работает с другими шаблонизаторами, включая Twig, Smarty и сам PHP. Модели взаимодействуют с сопоставителями данных F3 и помощником SQL для более сложных взаимодействий с различными механизмами баз данных. Другие плагины расширяют базовую функциональность еще больше. Это общая платформа веб-разработки — с большим запасом!

Хватит говорить — смотрите сами

Распакуйте содержимое дистрибутива в любое место на вашем жестком диске. По умолчанию файл фреймворка и дополнительные плагины находятся в lib/ path. Организуйте свои структуры каталогов так, как вы хотите. Вы можете переместить папки по умолчанию в путь, который не доступен через Интернет для большей безопасности. Удалите плагины, которые вам не нужны. Вы всегда можете восстановить их позже, и F3 обнаружит их присутствие автоматически.

Важное замечание : Если ваше приложение использует APC, Memcached, WinCache, XCache или кеш файловой системы, сначала очистите все записи в кеше, прежде чем перезаписывать старую версию фреймворка новой.

Убедитесь, что вы используете правильную версию PHP. F3 не поддерживает версии более ранние, чем PHP 5.4. Вы будете получать синтаксические ошибки (ложные срабатывания) повсюду, потому что новые языковые конструкции и замыкания / анонимные функции не поддерживаются устаревшими версиями PHP. Чтобы узнать это, откройте консоль (оболочка bash в GNU / Linux или cmd.exe в Windows): —

/path/to/php -v

PHP даст вам знать, какую именно версию вы используете, и вы должны получить что-то похожее на это: —

Обновите при необходимости и вернитесь сюда, если вы перешли на PHP 5.4 или более позднюю версию. Если вам нужен хостинг-провайдер PHP 5.4+, попробуйте один из следующих сервисов:

Hello, World: менее чем за минуту без плясок с бубном

Время начать писать наше первое приложение: —

base.php первой строке base.php с соответствующим путем. Сохраните приведенный выше фрагмент кода как index.php в корневой веб-папке. Мы написали нашу первую веб-страницу.

Используете composer? Тогда просто запустите composer require bcosca/fatfree и используйте следующее:

Первая команда сообщает интерпретатору PHP, что вы хотите, чтобы функции и возможности платформы были доступны для вашего приложения. Метод $f3->route() сообщает Fat-Free, что веб-страница доступна по относительному URL, указанному косой чертой ( / ). Любой, кто посетит ваш сайт, расположенный по адресу http://www.example.com/ , увидит ‘Hello, world!’ сообщение, потому что URL / эквивалентен корневой странице. Чтобы создать маршрут, который разветвляется от корневой страницы, например http://www.example.com/inside/ , вы можете определить другой маршрут с помощью простой строки GET /inside .

Описанный выше маршрут указывает платформе на визуализацию страницы только при получении запроса URL-адреса с использованием метода HTTP GET . Более сложные веб-сайты, содержащие формы, используют другие методы HTTP, такие как POST , и вы также можете реализовать это как часть $f3->route().

Если платформа видит входящий запрос для вашей веб-страницы, расположенный по корневому URL / , она автоматически направляет запрос в функцию обратного вызова, которая содержит код, необходимый для обработки запроса и рендеринга соответствующего HTML-содержимого. В этом примере мы просто отправляем строку ‘Hello, world!’ в веб-браузер пользователя.

Итак, мы создали наш первый маршрут. Но это ничего не даст, кроме как сообщить F3, что есть процесс, который будет его обрабатывать, и есть текст для отображения в веб-браузере пользователя. Если у вас намного больше страниц на вашем сайте, вам нужно настроить разные маршруты для каждой группы. А пока давайте будем простыми. Чтобы $f3->run() платформе начать ожидание запросов, мы $f3->run() команду $f3->run() .

Не получается запустить пример? Если у вас возникли проблемы с запуском этой простой программы на вашем сервере, вам, возможно, придется немного изменить настройки веб-сервера. Взгляните на пример конфигурации Apache в следующем разделе (вместе с эквивалентами Nginx и Lighttpd).

Все еще есть проблемы? Убедитесь, что $f3 = require(‘path/to/base.php’); назначение происходит перед любым выводом в вашем скрипте. base.php изменяет заголовки HTTP, поэтому любой символ, который выводится в браузер до этого назначения, вызовет ошибки.

Маршрутный двигатель

Обзор.

Наш первый пример не был слишком трудным для глотания, не так ли? Если вам нравится немного больше вкуса в вашем супе без жира, вставьте другой маршрут перед командой

Вы не хотите загромождать глобальное пространство имен именами функций? Fat-Free распознает различные способы отображения обработчиков маршрутов в классы и методы ООП:

HTTP-запросы также могут быть направлены на методы статического класса:

$f3->route(‘GET /login’,’Auth::login’);

Переданные аргументы всегда указываются в качестве второго параметра:

Если заданный аргумент name будет foo (/ hello / foo), будет показан следующий вывод:

Hello foo

Маршруты и токены

В качестве демонстрации мощного предметно-ориентированного языка (DSL) Fat-Free вы можете указать один маршрут для обработки различных возможностей: —

В этом примере показано, как мы можем указать токен @count для представления части URL. Фреймворк будет обслуживать любой URL-адрес запроса, который соответствует префиксу /brew/ , например /brew/99 , /brew/98 и т. Д. Это будет отображать « ’99 bottles of beer on the wall’ и « ’98 bottles of beer on the wall’ соответственно. Fat-Free также примет запрос страницы для /brew/unbreakable. (Ожидайте, что это покажет ‘unbreakable bottles of beer on the wall’ .)

Когда такой динамический маршрут указан, Fat-Free автоматически заполняет глобальную переменную массива PARAMS значением захваченных строк в URL. $f3->get() внутри функции обратного вызова извлекает значение переменной структуры. Конечно, вы можете применить этот метод в своем коде как часть презентации или бизнес-логики. Но мы обсудим это более подробно позже.

Обратите внимание, что Fat-Free понимает точечные обозначения массива. Вместо этого вы можете использовать обычную запись PARAMS[‘count’] вместо кода в коде, который подвержен ошибкам опечаток и несбалансированным скобкам. В представлениях и шаблонах платформа допускает нотацию @PARAMS.count которая в некоторой степени похожа на Javascript. (Мы рассмотрим виды и шаблоны позже.)

Вот еще один способ получить доступ к токенам в шаблоне запроса:

Вы можете использовать звездочку ( * ), чтобы принять любой URL-адрес после маршрута /brew — если вы действительно не заботитесь об остальной части пути: —

Важный момент, на который следует обратить внимание: вы будете сбиты с толку обезжиренным (и самим), если в одном приложении у вас есть и GET /brew/@count и GET /brew/* . Используйте один или другой. Другое дело: Fat-Free рассматривает GET /brew как отдельный и отличный от маршрута GET /brew/@count . У каждого могут быть разные обработчики маршрута.
Динамические веб-сайты

Подождите секунду — во всех предыдущих примерах мы никогда не создавали каталог на жестком диске для хранения этих маршрутов. Короткий ответ: нам не нужно. Все маршруты F3 являются виртуальными. Они не отражают структуру папок нашего жесткого диска. Если у вас есть программы или статические файлы (изображения, CSS и т. Д.), Которые не используют платформу — если пути к этим файлам не конфликтуют с какими-либо маршрутами, определенными в вашем приложении, — программное обеспечение вашего веб-сервера доставит их на сервер. браузер пользователя, если сервер настроен правильно.
Названные маршруты

Когда вы определяете маршрут, вы можете назначить ему имя. Используйте имя маршрута в вашем коде и шаблонах вместо напечатанного URL. Затем, если вам нужно изменить свои URL-адреса, чтобы угодить начальникам по маркетингу, вам нужно только изменить место, где был определен маршрут. Имена маршрутов должны соответствовать правилам именования переменных php (без точек, тире или дефисов).

Назовем маршрут: —

$f3->route(‘GET @beer_list: /beer’, ‘Beer->list’);

Имя вставляется после маршрута VERB (в данном примере GET ), перед которым стоит символ @ , и отделяется от части URL двоеточием : символ. Вы можете вставить пробел после двоеточия, если это облегчает чтение вашего кода (как показано здесь).

Чтобы получить доступ к именованному маршруту в шаблоне, получите значение именованного маршрута в качестве ключа массива ALIASES : —

View beer list

Чтобы перенаправить посетителя на новый URL-адрес, вызовите именованный маршрут внутри метода reroute() например:

// именованный маршрут является строковым значением
$f3->reroute(‘@beer_list’); // обратите внимание на одинарные кавычки

Если вы используете токены в своем маршруте, F3 заменит эти токены их текущим значением. Если вы хотите изменить значение токена перед вызовом перенаправления, передайте его как 2-й аргумент.

Не забудьте urlencode() свои аргументы, если у вас есть символы, которые не соответствуют рекомендациям RFC 1738 для правильно сформированных URL.
Встроенный веб-сервер PHP 5.4

Последняя стабильная версия PHP имеет собственный встроенный веб-сервер. Запустите его, используя следующую конфигурацию: —

Приведенная выше команда начнет маршрутизацию всех запросов в корневой каталог /var/www . Если получен входящий HTTP-запрос для файла или папки, PHP будет искать его в корневом веб-каталоге и отправлять его в браузер, если он найден. В противном случае PHP загрузит index.php по умолчанию (содержащий ваш код с поддержкой F3).
Пример конфигурации Apache

Если вы используете Apache, убедитесь, что вы активировали модуль перезаписи URL (mod_rewrite) в файле apache.conf (или httpd.conf). Вы также должны создать файл .htaccess, содержащий следующее: —

Сценарий сообщает Apache, что всякий раз, когда поступает HTTP-запрос и если не удается найти физический файл ( !-f ), путь ( !-d ) или символическую ссылку ( !-l ), он должен передать управление в index.php , который содержит наш главный / фронт-контроллер, который, в свою очередь, вызывает фреймворк.

.htaccess file содержащий директивы Apache, указанные выше, всегда должен находиться в той же папке, что и index.php .

Вам также нужно настроить Apache, чтобы он знал физическое местоположение index.php на вашем жестком диске. Типичная конфигурация:

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

Каждое site1.com site2.com ( site1.com и site2.com в нашем примере) должно быть указано в /etc/hosts . В Windows вы должны отредактировать C:/WINDOWS/system32/drivers/etc/hosts . Перезагрузка может потребоваться, чтобы изменения вступили в силу. Затем вы можете указать свой веб-браузер по адресу http://site1.com или http://site2.com . Виртуальные хосты значительно упрощают развертывание ваших приложений.
Пример конфигурации Nginx

Для серверов Nginx вот рекомендуемая конфигурация (замените ip_address: port на настройки PHP FastCGI вашей среды): —

Пример конфигурации Lighttpd

Серверы Lighttpd настраиваются аналогичным образом:

Пример конфигурации IIS

Установите модуль перезаписи URL и соответствующую платформу .NET, соответствующую вашей версии Windows. Затем создайте файл с именем web.config в корне приложения со следующим содержимым:

перенаправление

Итак, вернемся к кодированию. Вы можете объявить страницу устаревшей и перенаправить посетителей на другой сайт / страницу: —

Если кто-то пытается получить доступ к URL-адресу http://www.example.com/obsoletepage используя HTTP GET или HEAD-запрос, платформа перенаправляет пользователя на URL-адрес: http://www.example.com/newpage как показано на приведенный выше пример. Вы также можете перенаправить пользователя на другой сайт, например, $f3->reroute(‘http://www.anotherexample.org/’); ,

Перенаправление может быть особенно полезным, когда вам нужно выполнить некоторые работы по обслуживанию вашего сайта. У вас может быть обработчик маршрута, который информирует ваших посетителей о том, что ваш сайт не работает в течение короткого периода времени.

HTTP перенаправления необходимы, но они также могут быть дорогими. Насколько это возможно, воздержитесь от использования $f3->reroute() для отправки пользователя на другую страницу того же веб-сайта, если вы можете управлять потоком своего приложения, вызывая функцию или метод, который обрабатывает целевой маршрут.

Однако этот подход не изменит URL-адрес в адресной строке веб-браузера пользователя. Если это не то поведение, которое вам нужно, и вам действительно нужно отправить пользователя на другую страницу, например, при успешной отправке формы или после аутентификации пользователя, Fat-Free отправляет HTTP 303 See Other Заголовок HTTP 303 See Other . Для всех других попыток перенаправления на другую страницу или сайт платформа отправляет заголовок HTTP 301 Moved Permanently .
Запуск 404

Во время выполнения Fat-Free автоматически генерирует ошибку HTTP 404 всякий раз, когда обнаруживает, что входящий HTTP-запрос не соответствует ни одному из маршрутов, определенных в вашем приложении. Однако бывают случаи, когда вам нужно запустить его самостоятельно.

Возьмите, например, маршрут, определенный как GET /dogs/@breed . Логика вашего приложения может включать поиск в базе данных и попытку извлечь запись, соответствующую значению @breed во входящем HTTP-запросе. Поскольку Fat-Free будет принимать любое значение после префикса /dogs/ из-за присутствия токена @breed , программное отображение сообщения HTTP 404 Not Found становится необходимым, когда программа не находит соответствия в нашей базе данных. Для этого используйте следующую команду: —

Представительный государственный трансферт (РЕСТ)

Архитектура Fat-Free основана на том, что HTTP URI представляют собой абстрактные веб-ресурсы (не ограничиваясь HTML), и каждый ресурс может переходить из одного состояния приложения в другое. По этой причине F3 не имеет никаких ограничений на то, как вы структурируете свое приложение. Если вы предпочитаете использовать шаблон Model-View-Controller , F3 может помочь вам разделить компоненты приложения, придерживаясь этой парадигмы. С другой стороны, платформа также поддерживает шаблон Resource-Method- Presentation, и реализовать его проще.

Вот пример интерфейса ReST:

Метод Fat-Free $f3->map() предоставляет интерфейс ReST, сопоставляя методы HTTP в маршрутах с эквивалентными методами объекта или класса PHP. Если ваше приложение получает входящий HTTP-запрос, такой как GET /cart/123 , Fat-Free автоматически передает управление методу get() объекта или класса. С другой стороны, запрос POST /cart/123 будет перенаправлен в метод post() класса Item .

Примечание. Браузеры не реализуют методы HTTP PUT и DELETE в обычных формах HTML. Эти и другие методы ReST ( HEAD и CONNECT ) доступны только через вызовы AJAX на сервер.

Если инфраструктура получает HTTP-запрос для маршрута, который отображается на метод, который не реализован классом (возможно, вы сделали ошибку в отображении маршрута или метод еще не написан), она генерирует HTTP 405 Method Not Allowed ошибка.

Если клиент запрашивает OPTIONS HTTP для ресурса URL, F3 отвечает соответствующими заголовками HTTP, которые указывают, какие методы разрешены для ресурса (HEAD, GET, PUT и т. Д.). Каркас не будет сопоставлять запрос OPTIONS с классом.
Автозагрузчик F3

Fat-Free позволяет загружать классы только тогда, когда они вам нужны, поэтому они не сжигают больше памяти, чем требуется конкретному сегменту вашего приложения. И вам не нужно писать длинный список операторов include или require только для загрузки классов PHP, сохраненных в разных файлах и разных местах. Фреймворк может сделать это автоматически для вас. Просто сохраните ваши файлы (один класс на файл) в папке и скажите платформе, чтобы автоматически загружать соответствующий файл, когда вы вызываете метод в классе: —

Вы можете назначить другое местоположение для ваших автозагрузанных классов, изменив значение глобальной переменной AUTOLOAD . Вы также можете иметь несколько путей автозагрузки. Если ваши классы организованы и находятся в разных папках, вы можете указать платформе автозагрузку соответствующего класса при вызове статического метода или при создании объекта. Измените переменную AUTOLOAD следующим образом:

Важное замечание: За исключением расширения .php, имя класса и имя файла должны быть идентичны, чтобы инфраструктура правильно загружала ваш класс. Базовое имя этого файла должно совпадать с вызовом вашего класса, например, F3 будет искать либо Foo/BarBaz.php либо foo/barbaz.php когда обнаружит new Foo\BarBaz оператор new Foo\BarBaz в вашем приложении.

Работа с пространствами имен

AUTOLOAD позволяет иерархиям классов находиться в подпапках с одинаковыми именами, поэтому если вы хотите, чтобы инфраструктура автоматически загружала класс пространств имен PHP 5.4, который вызывается следующим образом: —

Вы можете создать иерархию папок, которая соответствует той же структуре. Предполагая, что /var/www/html/ является вашим веб-корнем, F3 будет искать класс в /var/www/html/autoload/gadgets/ipad.php . Файл ipad.php должен иметь следующий минимальный код: —

namespace Gadgets;
class iPad {}

Помните: все имена каталогов в Fat-Free должны заканчиваться косой чертой. Вы можете назначить путь поиска для автозагрузчика следующим образом: —

Маршрутизация к классу пространства имен

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

Приведенный выше код вызовет статический метод show() класса Home в пространстве имен Main . Класс Home должен быть сохранен в папке classes/main/home.php для его автоматической загрузки.

Если вы предпочитаете работать с объектами: —

создаст экземпляр класса Home во время выполнения и после этого вызовет метод show() .

Обработчики событий

В F3 есть пара приемников событий маршрутизации, которые могут помочь вам улучшить поток и структуру классов контроллеров. Скажем, у вас есть маршрут, определенный следующим образом:

Если приложение получает HTTP-запрос, соответствующий указанному выше маршруту, F3 создает экземпляр Main , но перед выполнением метода home() платформа ищет метод в этом классе с именем beforeRoute() . В случае обнаружения F3 запускает код, содержащийся в обработчике события beforeRoute() перед передачей управления методу home() . Как только это будет выполнено, платформа ищет обработчик события afterRoute() . Как и beforeRoute() , метод выполняется, если он определен.

Динамические обработчики маршрутов

Вот еще одна вкусняшка F3: —

Если ваше приложение получит запрос, скажем, на /products/itemize , F3 извлечет строку ‘itemize’ из URL-адреса и передаст ее @action в обработчике маршрута. Затем F3 будет искать класс с именем Products и выполнять метод itemize() .

Обработчики динамических маршрутов могут иметь различные формы:

F3 вызывает ошибку HTTP 404 Not Found во время выполнения, если он не может передать управление классу или методу, связанному с текущим маршрутом, то есть неопределенному классу или методу.

AJAX и синхронные запросы

Шаблоны маршрутизации могут содержать модификаторы, которые предписывают платформе основывать свое решение о маршрутизации на типе HTTP-запроса:

Первый оператор направит HTTP-запрос к Page->getFragment() только если сервер получил заголовок X-Requested-With: XMLHttpRequest (объект AJAX). Если обнаружен обычный (синхронный) запрос, F3 просто перейдет к следующему сопоставленному шаблону, и в этом случае он выполнит Page->getFull() .

Если в шаблоне маршрутизации не определены модификаторы, то и AJAX, и синхронные типы запросов направляются указанному обработчику.

Модификаторы шаблонов маршрутов также распознаются $f3->map().

Рамочные переменные

Основное использование.

Переменные, определенные в Fat-Free, являются глобальными, то есть к ним может обращаться любой компонент MVC. Фреймворковые глобалы не идентичны PHP глобальным. Переменная F3 с именем content не идентична переменной $content в PHP. F3 сам по себе является предметно-ориентированным языком и поддерживает свою собственную таблицу символов для системных переменных и переменных приложения.
Фреймворк, как и любая хорошо спроектированная объектно-ориентированная программа, не загрязняет глобальное пространство имен PHP константами, переменными, функциями или классами, которые могут конфликтовать с любым приложением. В отличие от других платформ, F3 не использует оператор PHP define() . Все каркасные константы ограничены классами.

Чтобы назначить значение переменной без жира:

Примечание. Переменные без жира принимают все типы данных PHP, включая объекты и анонимные функции.

Чтобы установить несколько переменных одновременно:

Чтобы получить значение переменной структуры с именем var : —

Чтобы удалить переменную Fat-Free из памяти, если она вам больше не нужна (откажитесь от нее, чтобы она не мешала другим вашим функциям / методам), используйте метод: —

Чтобы узнать, была ли переменная определена ранее:

Глобальные переменные

F3 поддерживает свою собственную таблицу символов для переменных каркаса и приложения, которые не зависят от PHP. Некоторые переменные отображаются в глобальные переменные PHP. Сессия Fat-Free эквивалентна $_SESSION , а REQUEST отображается на $_REQUEST . Рекомендуется использовать каркасные переменные вместо PHP, чтобы помочь вам в передаче данных между различными функциями, классами и методами. У них также есть другие преимущества:

Вы можете использовать каркасные переменные прямо в ваших шаблонах.
Вам не нужно указывать PHP ссылаться на переменную вне текущей области, используя глобальное ключевое слово внутри каждой функции или метода. Все переменные F3 являются глобальными для вашего приложения.
Установка обезжиренного эквивалента глобального PHP, такого как SESSION также меняет основную часть PHP $_SESSION. Изменение последнего также изменяет рамочный аналог.

Fat-Free не поддерживает только тупое хранилище для переменных и их значений. Он также может автоматизировать управление сессиями и другие вещи. Присвоение или получение значения через переменную SESSION F3 автоматически запускает сеанс. Если вы используете $_SESSION (или функции, связанные с сеансами) напрямую, вместо переменной среды SESSION , ваше приложение становится ответственным за управление сеансами.

Как правило, каркасные переменные не сохраняются между HTTP-запросами.Только SESSIONи COOKIE(и их элементы), которые сопоставляются с PHP $_SESSIONи $_COOKIEглобальными переменными, освобождаются от HTTP-статуса без состояния.

Есть несколько предопределенных глобальных переменных, используемых Fat-Free внутри, и вы, безусловно, можете использовать их в своем приложении. Убедитесь, что вы знаете, что делаете. Изменение некоторых глобальных переменных без жира может привести к неожиданному поведению платформы.

Фреймворк имеет несколько переменных, которые помогут вам организовать ваши файлы и структуры каталогов. Мы видели, как мы можем автоматизировать загрузку классов с помощью AUTOLOAD. Существует UIглобальная переменная, которая содержит путь, указывающий на местоположение ваших HTML-представлений / шаблонов. DEBUGэто еще одна переменная, которую вы будете использовать довольно часто во время разработки приложения, и она используется для настройки многословности трассировки ошибок.

Обратитесь к Краткому справочнику, если вам нужен полный список встроенных переменных структуры.
Правила именования

Каркасная переменная может содержать любое количество букв, цифр и подчеркиваний. Он должен начинаться с буквенного символа и не должен содержать пробелов. Имена переменных чувствительны к регистру.

F3 использует заглавные буквы для внутренних предопределенных глобальных переменных. Ничто не мешает вам использовать имена переменных, состоящие из заглавных букв в вашей собственной программе, но, как правило, придерживайтесь строчных букв (или camelCase), когда вы устанавливаете свои собственные переменные, чтобы вы могли избежать любого возможного конфликта с текущими и будущими выпусками платформы ,

Вы не должны использовать PHP зарезервированные слова , как if, for, class, defaultи т.д. в качестве имен переменных рамочные. Это может привести к непредсказуемым результатам.
Работа со строковыми и массивными переменными

F3 также предоставляет ряд инструментов, которые помогут вам с переменными каркаса.

F3 также предоставляет несколько примитивных методов для работы с переменными массива:

Самостоятельные структуры каталогов

В отличие от других структур, которые имеют жесткую структуру папок, F3 дает вам большую гибкость. Вы можете иметь структуру папок, которая выглядит следующим образом (заключенные в скобки слова в заглавных буквах представляют переменные среды F3, которые необходимо настроить): —

Не стесняйтесь организовывать свои файлы и каталоги любым удобным для вас способом. Просто установите соответствующие глобальные переменные F3. Если вы хотите действительно безопасный сайт, Fat-Free даже позволяет хранить все ваши файлы в недоступном для Интернета каталоге. Единственное требование состоит в том , что вы оставите index.php, .htaccessи ваши общедоступные файлы, такие как CSS, JavaScript, изображения и т.д. в пути видна в вашем браузере.
Об обработчике ошибок F3

Fat-Free генерирует свои собственные страницы ошибок HTML со следами стека, чтобы помочь вам с отладкой. Вот пример:

Внутренняя ошибка сервера

strpos() expects at least 2 parameters, 0 given

• var/html/dev/main.php:96 strpos()
• var/html/dev/index.php:16 Base->run()

Если вы чувствуете, что это слишком просто или хотите делать что-то другое при возникновении ошибки, вы можете создать свой собственный обработчик ошибок: —

F3 поддерживает глобальную переменную, содержащую сведения о последней ошибке, произошедшей в вашем приложении. ERRORПеременная является массивом структурирована следующим образом : —

При разработке приложения лучше всего установить максимальный уровень отладки, чтобы вы могли отследить все ошибки до их первопричины: —

Просто вставьте команду в последовательность загрузки вашего приложения.

Как только ваше приложение будет готово к выпуску, просто удалите заявление из вашего приложения или замените его следующим:

Это подавит вывод трассировки стека на любой сгенерированной системой странице ошибки HTML (потому что она не предназначена для просмотра посетителями вашего сайта).

DEBUG может иметь значения в диапазоне от 0 (трассировка стека подавлена) до 3 (наиболее многословно).

Не забывайТрассировки стека могут содержать пути, имена файлов, команды базы данных, имена пользователей и пароли. Вы можете подвергнуть свой веб-сайт излишним угрозам безопасности, если вам не удастся установить для DEBUGглобальной переменной значение 0 в производственной среде.
Конфигурационные файлы

Если ваше приложение должно быть настраиваемым пользователем, F3 предоставляет удобный метод для чтения файлов конфигурации для настройки вашего приложения. Таким образом, вы и ваши пользователи могут настроить приложение, не изменяя код PHP.

Вместо создания сценария PHP, который содержит следующий пример кода:

Вы можете создать файл конфигурации, который делает то же самое:

Вместо длинных $f3->set()операторов в вашем коде вы можете указать платформе загрузить файл конфигурации в качестве замены кода. Давайте сохраним приведенный выше текст как setup.cfg. Затем мы можем назвать это простым:

Строковые значения не нужно заключать в кавычки, если только вы не хотите, чтобы в них были начальные или конечные пробелы. Если запятую следует рассматривать как часть строки, заключите строку в двойные кавычки — в противном случае значение будет считаться массивом (запятая используется как разделитель элементов массива). Строки могут занимать несколько строк: —

F3 также дает вам возможность определять маршруты HTTP в файлах конфигурации:

Карты маршрутов также могут быть определены в конфигурационных файлах: —

[globals], [routes]И [maps]заголовки разделов необходимы. Вы можете объединить оба раздела в одном файле конфигурации — хотя рекомендуется иметь [routes]и [maps]в отдельном файле. Таким образом, вы можете позволить конечным пользователям изменять некоторые специфичные для приложения флаги и в то же время ограничивать их вмешательство в логику маршрутизации.

Представления и шаблоны

Разделение сущностей.

Пользовательский интерфейс, такой как страница HTML, должен быть независимым от базового кода PHP, связанного с маршрутизацией и бизнес-логикой. Это является фундаментальным для парадигмы MVC. Базовая ревизия, такая как преобразование

в,

не должна требовать изменения в коде вашего приложения. Таким же образом, превращая простой маршрут , как GET /aboutк GET /about-usне должны иметь никакого влияния на ваш пользовательский интерфейс и бизнес — логики, (вид и модель в MVC, или представление и метод в РМР).

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

F3 поддерживает PHP как шаблонизатор. Посмотрите на этот фрагмент HTML, сохраненный как template.htm: -.

Hello, !

Если на вашем сервере включены короткие теги, это тоже должно работать:

Hello,

Чтобы отобразить этот шаблон, вы можете иметь код PHP, который выглядит следующим образом (хранится в файле, отдельном от шаблона): —

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

Быстрый взгляд на язык шаблонов F3

В качестве альтернативы PHP вы можете использовать собственный шаблонизатор F3. Приведенный выше фрагмент HTML можно переписать так:

Hello, {{ @name }}!

и код, необходимый для просмотра этого шаблона: —

Подобно токенам маршрутизации, используемым для перехвата переменных в URL (все еще помните GET /brew/@countпример из предыдущего раздела?), Токены шаблона F3 начинаются с @символа, за которым следует ряд букв и цифр, заключенных в фигурные скобки. Первый символ должен быть альфа. Шаблонные токены имеют непосредственное соответствие с переменными каркаса. Каркас автоматически заменяет токен значением, хранящимся в переменной с тем же именем.

В нашем примере F3 заменяет @nameтокен в нашем шаблоне значением, которое мы присвоили переменной name. Во время выполнения вывод приведенного выше кода будет:

Hello, world

Беспокоитесь о производительности шаблонов F3? Во время выполнения платформа анализирует и компилирует / конвертирует шаблон F3 в код PHP при первом его отображении $template->render(). Фреймворк затем использует этот скомпилированный код во всех последующих вызовах. Следовательно, производительность должна быть такой же, как у шаблонов PHP, если не лучше из-за оптимизации кода, выполняемой компилятором шаблонов, когда задействованы более сложные шаблоны.

Используете ли вы шаблонный движок PHP или собственный F3, рендеринг шаблонов может быть значительно быстрее, если на вашем сервере есть APC, WinCache или XCache.

Как упоминалось ранее, переменные каркаса могут содержать любой тип данных PHP. Однако использование нескалярных типов данных в шаблонах F3 может привести к странным результатам, если вы не будете осторожны. Выражения в фигурных скобках всегда будут оцениваться и преобразовываться в строку. Вы должны ограничить переменные пользовательский интерфейс для простых скаляров: — string, integer, booleanили floatтипов данных.

Но как насчет массивов? Fat-Free распознает массивы, и вы можете использовать их в своих шаблонах. Вы можете слепить что-то вроде: —

{{ @buddy[0] }}, {{ @buddy[1] }}, and {{ @buddy[2] }}

И заполните @buddyмассив в вашем PHP-коде, прежде чем обслуживать шаблон: —

$f3->set(‘buddy’,[‘Tom’,’Dick’,’Harry’]);

Однако, если вы просто вставите {{ @buddy }}в свой шаблон, PHP 5.4 заменит его, ‘Array’ потому что он преобразует токен в строку. PHP 5.4, с другой стороны, будет генерировать Array to string conversionуведомление во время выполнения.

F3 позволяет встраивать выражения в шаблоны. Эти выражения могут принимать различные формы, такие как арифметические вычисления, логические выражения, константы PHP и т. Д. Вот несколько примеров:

Дополнительное примечание о выражениях массива: обратите внимание, что @foo.@barэто конкатенация строк $foo.$bar), тогда как @foo.barпереводится как $foo[‘bar’]. Если $foo[$bar]это то, что вы хотели, используйте @foo[@bar]обычные обозначения.

Каркасные переменные также могут содержать анонимные функции:

Механизм шаблонов F3 будет интерпретировать токен, как ожидается, если вы укажете следующее выражение:

{{ @func(‘hello’,’world’) }}

Шаблоны внутри шаблонов

Простая замена переменных — это то, что есть во всех шаблонизаторах. У Fat-Free больше рукавов: —

Директива будет встраивать содержимое шаблона header.htm в точное место, где указана директива. Вы также можете иметь динамический контент в виде: —

Практическое использование для такой директивы шаблона — это когда у вас есть несколько страниц с общим макетом HTML, но с разным содержанием. Инструктировать фреймворк для вставки подшаблона в ваш основной шаблон так же просто, как написать следующий код PHP:

В свою очередь, суб-шаблон может содержать любое количество директив. F3 позволяет неограниченное количество вложенных шаблонов.

Вы можете указать имена файлов с чем-то иным, чем расширения .htm или .html, но их проще предварительно просмотреть в веб-браузере на этапе разработки и отладки. Шаблонный движок не ограничивается рендерингом файлов HTML. Фактически вы можете использовать шаблонизатор для рендеринга других типов файлов.

Директива также имеет необязательный ifатрибут , так что вы можете указать условие , которое должно быть выполнено до того , как суб-шаблон вставляется: —

Исключение сегментов

В ходе написания / отладки программ на основе F3 и разработки шаблонов могут быть случаи, когда отключение отображения блока HTML может оказаться полезным. Вы можете использовать директиву для этой цели:

Это похоже на тег HTML-комментария, но директива делает HTML-блок полностью невидимым после визуализации шаблона.

Вот еще один способ исключения содержимого шаблона или добавления комментариев: —

{*

Кусок HTML, который мы не хотим отображать в данный момент

*}

Условные сегменты

Другая полезная функция шаблона — это директива. Позволяет встраивать фрагмент HTML в зависимости от оценки определенного условия. Вот несколько примеров:-

Вы можете иметь столько вложенных директив, сколько вам нужно.

Автоматически вызывается выражение F3 внутри атрибута if, равного NULLпустой строке, логическому значению FALSE, пустому массиву или нулю . Если в вашем шаблоне нет блока, то открывающий и закрывающий теги необязательны: —

Повторяющиеся сегменты

Fat-Free также может обрабатывать повторяющиеся блоки HTML: —

groupАтрибут @fruitsвнутри директивы должен быть массивом и должен быть установлен в вашем PHP кода соответственно: —

$f3->set(‘fruits’,[‘apple’,’orange ‘,’ banana’]);

Ничего не получается, присваивая значение @fruitв коде вашего приложения. Fat-Free игнорирует любое заданное значение, которое может иметь, поскольку использует переменную для представления текущего элемента во время итерации по группе. Вывод вышеупомянутого фрагмента шаблона HTML и соответствующего кода PHP становится:

apple

orange

banana

Каркас позволяет неограниченное вложение блоков: —

Примените следующую команду F3: —

В результате вы получите следующий HTML-фрагмент:

Удивительно, не правда ли? And the only thing you had to do in PHP was to define the contents of a single F3 variable div to replace the @div token. Fat-Free makes both programming and Web template design really easy.

В шаблонной директиве valueатрибут возвращает значение текущего элемента в итерации. Если вам нужно получить ключ массива текущего элемента, используйте keyвместо этого атрибут. keyАтрибут является необязательным.

также имеет необязательный атрибут counter, который можно использовать следующим образом:

Внутренне механизм шаблонов F3 записывает количество итераций цикла и сохраняет это значение в переменной / токене @ctr, которая используется в нашем примере для определения нечетной / четной классификации.

Встраивание JavaScript и CSS

Если вам нужно вставить токены F3 внутри