Ein leistungsstarkes und dennoch benutzerfreundliches PHP-Mikroframework, mit dem Sie schnell dynamische und robuste Webanwendungen erstellen können!
Komprimiert in einer einzigen ca. 65-KB-Datei bietet Ihnen F3 (wie wir es liebevoll nennen) eine solide Grundlage, eine ausgereifte Codebasis und einen sachlichen Ansatz zum Schreiben von Webanwendungen. Unter der Haube verbirgt sich ein benutzerfreundliches Webentwicklungs-Toolkit, eine leistungsstarke URL-Routing- und Cache-Engine, integrierte Code-Hervorhebung und Unterstützung für mehrsprachige Anwendungen. Es ist leicht, einfach zu bedienen und schnell. Vor allem steht es Ihnen nicht im Weg.
Egal, ob Sie ein Anfänger oder ein erfahrener PHP-Programmierer sind, mit F3 sind Sie im Handumdrehen einsatzbereit. Keine unnötigen und mühsamen Installationsvorgänge. Keine komplexe Konfiguration erforderlich. Keine komplizierten Verzeichnisstrukturen. Es gibt keinen besseren Zeitpunkt, um mit der einfachen Entwicklung von Webanwendungen zu beginnen als jetzt!
F3 unterstützt sowohl SQL- als auch NoSQL-Datenbanken von der Stange: MySQL, SQLite, MSSQL/Sybase, PostgreSQL, DB2 und MongoDB. Es verfügt außerdem über leistungsstarke objektrelationale Mapper für die Datenabstraktion und -modellierung, die genauso leichtgewichtig sind wie das Framework. Keine Konfiguration erforderlich.
Das ist noch nicht alles. F3 ist mit weiteren optionalen Plug-Ins ausgestattet, die seine Funktionen erweitern:-
Im Gegensatz zu anderen Frameworks zielt F3 darauf ab, benutzbar zu sein – nicht üblich.
Die Philosophie hinter dem Framework und seinem Ansatz zur Softwarearchitektur zielt auf Minimalismus bei Strukturkomponenten, die Vermeidung von Anwendungskomplexität und die Schaffung eines Gleichgewichts zwischen Code-Eleganz, Anwendungsleistung und Programmiererproduktivität ab.
F3 verfügt über eine stabile Architektur der Enterprise-Klasse. Unschlagbare Leistung, benutzerfreundliche Funktionen und eine geringe Stellfläche. Was kann man mehr verlangen? Um dieses Paket zu erhalten, laden Sie einfach dieses Paket herunter oder besuchen Sie das fatfree-core-Repository, um die neueste Edge-Version zu finden.
Für alle Composer-Benutzer da draußen:
composer create-project bcosca/fatfree
composer require bcosca/fatfree-core
Erfahrenen Benutzern wird dringend empfohlen, neue Anwendungen mit der neuesten Version zu entwickeln, um von einer aktualisierten Codebasis und laufenden Verbesserungen zu profitieren.
Das aktuellste Benutzerhandbuch und eine detaillierte API-Dokumentation mit vielen Codebeispielen und einer grafischen Anleitung finden Sie unter fatfreeframework.com/.
Natürlich wird diese praktische Online-Referenz von F3 unterstützt! Es zeigt die Leistungsfähigkeit und Leistung des Frameworks. Probieren Sie es jetzt aus. Wenn Sie es direkt auf Github lesen möchten, finden Sie den Inhalt der Website unter github.com/F3Community/F3com-data
Ein Designer weiß, dass er Perfektion erreicht hat, nicht dann, wenn es nichts mehr hinzuzufügen gibt, sondern wenn es nichts mehr wegzunehmen gibt. – Antoine de Saint-Exupéry
Mit dem Fat-Free Framework können Sie im Handumdrehen komplette Websites erstellen. Mit der gleichen Leistung und Kürze wie moderne Javascript-Toolkits und -Bibliotheken hilft Ihnen F3 dabei, besser aussehende und zuverlässigere PHP-Programme zu schreiben. Ein Blick auf Ihren PHP-Quellcode und jeder wird leicht verstehen, wie viel Sie mit so wenigen Codezeilen erreichen können und wie leistungsstark die Ergebnisse sind.
F3 ist eines der am besten dokumentierten Frameworks überhaupt. Es zu lernen kostet so gut wie nichts. Keine strengen, schwer zu navigierenden Verzeichnisstrukturen und aufdringlichen Programmierschritte. Keine Unmengen an Konfigurationsoptionen, nur um 'Hello, World'
in Ihrem Browser anzuzeigen. Fat-Free gibt Ihnen viel Freiheit – und Stil – um mehr Arbeit einfacher und in kürzerer Zeit zu erledigen.
Der deklarative Programmieransatz von F3 macht es sowohl Anfängern als auch Experten leicht, PHP-Code zu verstehen. Wenn Sie mit der Programmiersprache Ruby vertraut sind, werden Sie die Ähnlichkeit zwischen Fat-Free und dem Sinatra-Mikroframework bemerken, da beide eine einfache domänenspezifische Sprache für ReSTful-Webdienste verwenden. Aber im Gegensatz zu Sinatra und seinen PHP-Inkarnationen (Fitzgerald, Limonade, Glue – um nur einige zu nennen) geht Fat-Free über die reine Bearbeitung von Routen und Anfragen hinaus. Ansichten können in beliebiger Form vorliegen, z. B. als einfacher Text, HTML, XML oder als E-Mail-Nachricht. Das Framework verfügt über eine schnelle und benutzerfreundliche Template-Engine. F3 funktioniert auch nahtlos mit anderen Template-Engines, einschließlich Twig, Smarty und PHP selbst. Modelle kommunizieren mit den Datenzuordnungen von F3 und dem SQL-Helfer für komplexere Interaktionen mit verschiedenen Datenbank-Engines. Weitere Plug-Ins erweitern die Basisfunktionalität noch weiter. Es ist ein komplettes Webentwicklungs-Framework – mit viel Power!
Entpacken Sie den Inhalt des Distributionspakets an einer beliebigen Stelle auf Ihrer Festplatte. Standardmäßig befinden sich die Framework-Datei und optionale Plug-Ins im lib/
-Pfad. Organisieren Sie Ihre Verzeichnisstrukturen nach Ihren Wünschen. Aus Sicherheitsgründen können Sie die Standardordner in einen Pfad verschieben, der nicht über das Internet zugänglich ist. Löschen Sie die Plug-Ins, die Sie nicht benötigen. Sie können sie später jederzeit wiederherstellen und F3 erkennt ihre Anwesenheit automatisch.
Wichtig: Wenn Ihre Anwendung APC, Memcached, WinCache, XCache oder einen Dateisystem-Cache verwendet, löschen Sie zunächst alle Cache-Einträge, bevor Sie eine ältere Version des Frameworks mit einer neuen überschreiben.
Stellen Sie sicher, dass Sie die richtige PHP-Version verwenden. F3 unterstützt keine Versionen vor PHP 7.2. Sie erhalten überall Syntaxfehler (Falschmeldungen), da neue Sprachkonstrukte und Abschlüsse/anonyme Funktionen von veralteten PHP-Versionen nicht unterstützt werden. Um dies herauszufinden, öffnen Sie Ihre Konsole ( bash
Shell unter GNU/Linux oder cmd.exe
unter Windows): –
/path/to/php -v
PHP teilt Ihnen mit, welche bestimmte Version Sie verwenden, und Sie sollten etwas erhalten, das etwa so aussieht:-
PHP 7.4.21 (cli) (built: Jul 27 2021 15:56:07) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.9.8, Copyright (c) 2002-2020, by Derick Rethans
Führen Sie bei Bedarf ein Upgrade durch und kehren Sie hierher zurück, wenn Sie auf PHP 7.4 oder eine spätere Version umgestiegen sind. Fatfree benötigt mindestens PHP 7.2, um zu funktionieren. Wenn Sie einen Hosting-Dienstleister benötigen, probieren Sie einen dieser Dienste aus:
Es ist Zeit, mit dem Schreiben unserer ersten Bewerbung zu beginnen:-
$ f3 = require ( ' path/to/base.php ' );
$ f3 -> route ( ' GET / ' ,
function () {
echo ' Hello, world! ' ;
}
);
$ f3 -> run ();
Stellen Sie base.php
in der ersten Zeile den entsprechenden Pfad voran. Speichern Sie das obige Codefragment als index.php
in Ihrem Web-Stammordner. Wir haben unsere erste Webseite geschrieben.
Composer verwenden? Führen Sie dann einfach composer require bcosca/fatfree
aus und verwenden Sie Folgendes:
require ' vendor/autoload.php ' ;
$ f3 = Base:: instance ();
$ f3 -> route ( ' GET / ' ,
function () {
echo ' Hello, world! ' ;
}
);
$ f3 -> run ();
Der erste Befehl teilt dem PHP-Interpreter mit, dass die Funktionen und Features des Frameworks für Ihre Anwendung verfügbar sein sollen. Die Methode $f3->route()
informiert Fat-Free darüber, dass eine Webseite unter der durch den Schrägstrich ( /
) angegebenen relativen URL verfügbar ist. Jeder, der Ihre Website unter http://www.example.com/
besucht, wird die 'Hello, world!'
sehen. Nachricht, da die URL /
der Stammseite entspricht. Um eine Route zu erstellen, die von der Stammseite aus verzweigt, z. B. http://www.example.com/inside/
, können Sie eine andere Route mit einer einfachen GET /inside
-Zeichenfolge definieren.
Die oben beschriebene Route weist das Framework an, die Seite nur dann zu rendern, wenn es eine URL-Anfrage mit der HTTP- GET
Methode empfängt. Komplexere Websites mit Formularen verwenden andere HTTP-Methoden wie POST
, und Sie können diese auch als Teil einer $f3->route()
-Spezifikation implementieren.
Wenn das Framework eine eingehende Anfrage für Ihre Webseite unter der Stamm-URL /
erkennt, leitet es die Anfrage automatisch an die Rückruffunktion weiter, die den Code enthält, der zum Verarbeiten der Anfrage und zum Rendern des entsprechenden HTML-Inhalts erforderlich ist. In diesem Beispiel senden wir einfach die Zeichenfolge 'Hello, world!'
an den Webbrowser des Benutzers.
Also haben wir unsere erste Route festgelegt. Aber das bringt nicht viel, außer F3 darüber zu informieren, dass es einen Prozess gibt, der damit umgeht, und dass Text im Webbrowser des Benutzers angezeigt werden soll. Wenn Ihre Website sehr viele Seiten enthält, müssen Sie für jede Gruppe unterschiedliche Routen einrichten. Halten wir es vorerst einfach. Um das Framework anzuweisen, auf Anfragen zu warten, geben wir den Befehl $f3->run()
aus.
Sie können das Beispiel nicht zum Laufen bringen? Wenn Sie Probleme haben, dieses einfache Programm auf Ihrem Server auszuführen, müssen Sie möglicherweise die Einstellungen Ihres Webservers etwas anpassen. Sehen Sie sich im folgenden Abschnitt die Beispiel-Apache-Konfiguration an (zusammen mit den Nginx- und Lighttpd-Äquivalenten).
Haben Sie immer noch Probleme? Stellen Sie sicher, dass $f3 = require('path/to/base.php');
Die Zuweisung erfolgt vor jeder Ausgabe in Ihrem Skript. base.php
modifiziert die HTTP-Header, sodass jedes Zeichen, das vor dieser Zuweisung an den Browser ausgegeben wird, Fehler verursacht.
Unser erstes Beispiel war nicht allzu schwer zu schlucken, oder? Wenn Sie etwas mehr Geschmack in Ihrer fettfreien Suppe mögen, fügen Sie vor dem Befehl $f3->run()
eine weitere Route ein:-
$ f3 -> route ( ' GET /about ' ,
function () {
echo ' Donations go to a local charity... us! ' ;
}
);
Sie möchten den globalen Namensraum nicht mit Funktionsnamen überladen? Fat-Free erkennt verschiedene Möglichkeiten zum Zuordnen von Routenhandlern zu OOP-Klassen und -Methoden:
class WebPage {
function display () {
echo ' I cannot object to an object ' ;
}
}
$ f3 -> route ( ' GET /about ' , ' WebPage->display ' );
HTTP-Anfragen können auch an statische Klassenmethoden weitergeleitet werden:
$ f3 -> route ( ' GET /login ' , ' Auth::login ' );
Übergebene Argumente werden immer als zweiter Parameter bereitgestellt:
$ f3 -> route ( ' GET /hello/@name ' , ' User::greet ' );
class User {
public static function greet ( $ f3 , $ args ) { // $ args is type of Array
echo " Hello " . $ args [ ' name ' ];
}
}
Wenn das bereitgestellte Namensargument foo (/hello/foo) wäre, würde die folgende Ausgabe angezeigt:
Hello foo
Als Demonstration der leistungsstarken domänenspezifischen Sprache (DSL) von Fat-Free können Sie eine einzelne Route angeben, um verschiedene Möglichkeiten zu bewältigen:-
$ f3 -> route ( ' GET /brew/@count ' ,
function ( $ f3 ) {
echo $ f3 -> get ( ' PARAMS.count ' ). ' bottles of beer on the wall. ' ;
}
);
Dieses Beispiel zeigt, wie wir ein Token @count
angeben können, um einen Teil einer URL darzustellen. Das Framework bedient jede Anforderungs-URL, die mit dem Präfix /brew/
übereinstimmt, z. B. /brew/99
, /brew/98
usw. Dadurch werden '99 bottles of beer on the wall'
und '98 bottles of beer on the wall'
angezeigt. , jeweils. Fat-Free akzeptiert auch eine Seitenanfrage für /brew/unbreakable
. (Erwarten Sie, dass dies 'unbreakable bottles of beer on the wall'
anzeigt.) Wenn eine solche dynamische Route angegeben wird, füllt Fat-Free automatisch die globale PARAMS
Array-Variable mit dem Wert der erfassten Zeichenfolgen in der URL. Der Aufruf $f3->get()
innerhalb der Callback-Funktion ruft den Wert einer Framework-Variablen ab. Sie können diese Methode durchaus in Ihrem Code als Teil der Präsentation oder Geschäftslogik anwenden. Aber wir werden das später noch ausführlicher besprechen.
Beachten Sie, dass Fat-Free die Punktnotation von Arrays versteht. Sie können stattdessen die reguläre Notation PARAMS['count']
im Code verwenden, der anfällig für Tippfehler und unausgeglichene geschweifte Klammern ist. In Ansichten und Vorlagen ermöglicht das Framework @PARAMS.count
Notation, die Javascript etwas ähnelt. (Auf Ansichten und Vorlagen gehen wir später ein.)
Hier ist eine weitere Möglichkeit, in einem Anforderungsmuster auf Token zuzugreifen: –
$ f3 -> route ( ' GET /brew/@count ' ,
function ( $ f3 , $ params ) {
echo $ params [ ' count ' ]. ' bottles of beer on the wall. ' ;
}
);
Sie können das Sternchen ( *
) verwenden, um jede URL nach der /brew
-Route zu akzeptieren – wenn Ihnen der Rest des Pfads nicht wirklich wichtig ist:-
$ f3 -> route ( ' GET /brew/* ' ,
function () {
echo ' Enough beer! We always end up here. ' ;
}
);
Ein wichtiger Punkt, den Sie bedenken sollten: Sie werden Fat-Free (und sich selbst) verwirren, wenn Sie GET /brew/@count
und GET /brew/*
zusammen in derselben Anwendung haben. Benutzen Sie das eine oder das andere. Eine andere Sache: Fat-Free betrachtet GET /brew
als getrennt und verschieden von der Route GET /brew/@count
. Jeder kann unterschiedliche Routenhandler haben.
Moment mal – in allen vorherigen Beispielen haben wir nie wirklich ein Verzeichnis auf unserer Festplatte erstellt, um diese Routen zu speichern. Die kurze Antwort: Das müssen wir nicht. Alle F3-Routen sind virtuell. Sie spiegeln nicht die Ordnerstruktur unserer Festplatte wider. Wenn Sie über Programme oder statische Dateien (Bilder, CSS usw.) verfügen, die das Framework nicht verwenden – sofern die Pfade zu diesen Dateien nicht mit einer in Ihrer Anwendung definierten Route in Konflikt stehen – wird Ihre Webserver-Software diese an die senden Browser des Benutzers, sofern der Server ordnungsgemäß konfiguriert ist.
Wenn Sie eine Route definieren, können Sie ihr einen Namen zuweisen. Verwenden Sie in Ihrem Code und Ihren Vorlagen den Routennamen anstelle einer eingegebenen URL. Wenn Sie dann Ihre URLs ändern müssen, um den Marketing-Oberherren zu gefallen, müssen Sie die Änderung nur dort vornehmen, wo die Route definiert wurde. Die Routennamen müssen den PHP-Variablennamensregeln entsprechen (keine Punkte, Bindestriche oder Bindestriche).
Nennen wir eine Route:-
$ f3 -> route ( ' GET @beer_list: /beer ' , ' Beer->list ' );
Der Name wird nach dem Routen-VERB (in diesem Beispiel GET
) mit vorangestelltem @
-Symbol eingefügt und durch einen Doppelpunkt vom URL-Teil getrennt :
Symbol. Sie können nach dem Doppelpunkt ein Leerzeichen einfügen, wenn dies das Lesen Ihres Codes erleichtert (wie hier gezeigt).
Um auf die benannte Route in einer Vorlage zuzugreifen, rufen Sie den Wert der benannten Route als Schlüssel des ALIASES
Hive-Arrays ab:
< a href =" {{ @ALIASES.beer_list }} " > View beer list </ a >
Um den Besucher zu einer neuen URL umzuleiten, rufen Sie die benannte Route innerhalb der reroute()
-Methode auf, wie zum Beispiel:
// a named route is a string value
$ f3 -> reroute ( ' @beer_list ' ); // note the single quotes
Wenn Sie auf Ihrer Route Token verwenden, ersetzt F3 diese Token durch ihren aktuellen Wert. Wenn Sie den Wert des Tokens vor dem Aufruf von reroute ändern möchten, übergeben Sie ihn als zweites Argument.:-
$ f3 -> route ( ' GET @beer_list: /beer/@country ' , ' Beer->bycountry ' );
$ f3 -> route ( ' GET @beer_list: /beer/@country/@village ' , ' Beer->byvillage ' );
// a set of key - value pairs is passed as argument to named route
$ f3 -> reroute ( ' @beer_list(@country=Germany) ' );
// if more than one token needed
$ f3 -> reroute ( ' @beer_list(@country=Germany,@village=Rhine) ' );
Denken Sie daran, Ihre Argumente mit urlencode()
zu versehen, wenn Sie Zeichen haben, die nicht den RFC 1738-Richtlinien für wohlgeformte URLs entsprechen.
Die neueste stabile Version von PHP verfügt über einen eigenen integrierten Webserver. Starten Sie es mit der folgenden Konfiguration:-
php -S localhost:80 -t /var/www/
Der obige Befehl beginnt mit der Weiterleitung aller Anfragen an das Webstammverzeichnis /var/www
. Wenn eine eingehende HTTP-Anfrage für eine Datei oder einen Ordner eingeht, sucht PHP im Web-Root danach und sendet sie an den Browser, wenn sie gefunden wird. Andernfalls lädt PHP die Standarddatei index.php
(die Ihren F3-aktivierten Code enthält).
Wenn Sie Apache verwenden, stellen Sie sicher, dass Sie das URL-Rewriting-Modul (mod_rewrite) in Ihrer Datei apache.conf (oder httpd.conf) aktivieren. Sie sollten außerdem eine .htaccess-Datei erstellen, die Folgendes enthält:
# Enable rewrite engine and route requests to framework
RewriteEngine On
# Some servers require you to specify the `RewriteBase` directive
# In such cases, it should be the path (relative to the document root)
# containing this .htaccess file
#
# RewriteBase /
RewriteRule ^(tmp)/|.ini$ - [R=404]
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
Das Skript teilt Apache mit, dass es die Kontrolle an index.php
übertragen soll, wenn eine HTTP-Anfrage eintrifft und keine physische Datei ( !-f
) oder kein Pfad ( !-d
) oder symbolischer Link ( !-l
) gefunden werden kann Unser Haupt-/Front-Controller, der wiederum das Framework aufruft.
Die .htaccess file
mit den oben genannten Apache-Anweisungen sollte sich immer im selben Ordner wie index.php
befinden.
Sie müssen Apache außerdem so einrichten, dass es den physischen Speicherort von index.php
auf Ihrer Festplatte kennt. Eine typische Konfiguration ist:-
DocumentRoot " /var/www/html "
< Directory "/var/www/html">
Options -Indexes +FollowSymLinks +Includes
AllowOverride All
Order allow,deny
Allow from All
</ Directory >
Wenn Sie mehrere Anwendungen gleichzeitig entwickeln, ist eine virtuelle Hostkonfiguration einfacher zu verwalten:
NameVirtualHost *
< VirtualHost *>
ServerName site1.com
DocumentRoot " /var/www/site1 "
< Directory "/var/www/site1">
Options -Indexes +FollowSymLinks +Includes
AllowOverride All
Order allow,deny
Allow from All
</ Directory >
</ VirtualHost >
< VirtualHost *>
ServerName site2.com
DocumentRoot " /var/www/site2 "
< Directory "/var/www/site2">
Options -Indexes +FollowSymLinks +Includes
AllowOverride All
Order allow,deny
Allow from All
</ Directory >
</ VirtualHost >
Jeder ServerName
( site1.com
und site2.com
in unserem Beispiel) muss in Ihrer Datei /etc/hosts
aufgeführt sein. Unter Windows sollten Sie C:/WINDOWS/system32/drivers/etc/hosts
bearbeiten. Möglicherweise ist ein Neustart erforderlich, damit die Änderungen wirksam werden. Anschließend können Sie Ihren Webbrowser auf die Adresse http://site1.com
oder http://site2.com
verweisen. Virtuelle Hosts erleichtern die Bereitstellung Ihrer Anwendungen erheblich.
Für Nginx-Server ist hier die empfohlene Konfiguration (ersetzen Sie ip_address:port durch die FastCGI-PHP-Einstellungen Ihrer Umgebung): –
server {
root /var/www/html;
location / {
index index.php index.html index.htm;
try_files $uri $uri / /index.php? $query_string ;
}
location ~ .php$ {
fastcgi_pass ip_address:port;
include fastcgi_params;
}
}
Lighttpd-Server werden auf ähnliche Weise konfiguriert:
$HTTP["host"] =~ "www.example.com$" {
url.rewrite-once = ( "^/(.*?)(?.+)?$"=>"/index.php/$1?$2" )
server.error-handler-404 = "/index.php"
}
Installieren Sie das URL-Rewrite-Modul und das entsprechende .NET-Framework entsprechend Ihrer Windows-Version. Erstellen Sie dann im Stammverzeichnis Ihrer Anwendung eine Datei namens web.config
mit folgendem Inhalt:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Application" stopProcessing="true">
<match url=".*" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Kommen wir also zurück zum Codieren. Sie können eine Seite für veraltet erklären und Ihre Besucher auf eine andere Website/Seite umleiten:-
$ f3 -> route ( ' GET|HEAD /obsoletepage ' ,
function ( $ f3 ) {
$ f3 -> reroute ( ' /newpage ' );
}
);
Wenn jemand versucht, über eine HTTP-GET- oder HEAD-Anfrage auf die URL http://www.example.com/obsoletepage
zuzugreifen, leitet das Framework den Benutzer zur URL http://www.example.com/newpage
weiter, wie in der Abbildung gezeigt obiges Beispiel. Sie können den Benutzer auch auf eine andere Site umleiten, z. B. $f3->reroute('http://www.anotherexample.org/');
.
Eine Umleitung kann besonders nützlich sein, wenn Sie Wartungsarbeiten an Ihrer Site durchführen müssen. Sie können einen Routenhandler einrichten, der Ihre Besucher darüber informiert, dass Ihre Website für einen kurzen Zeitraum offline ist.
HTTP-Weiterleitungen sind unverzichtbar, können aber auch teuer sein. Vermeiden Sie es soweit wie möglich, $f3->reroute()
zu verwenden, um einen Benutzer zu einer anderen Seite derselben Website weiterzuleiten, wenn Sie den Fluss Ihrer Anwendung steuern können, indem Sie die Funktion oder Methode aufrufen, die die Zielroute verarbeitet. Dieser Ansatz ändert jedoch nicht die URL in der Adressleiste des Webbrowsers des Benutzers. Wenn dies nicht das gewünschte Verhalten ist und Sie einen Benutzer wirklich auf eine andere Seite weiterleiten müssen, sendet Fat-Free in Fällen wie der erfolgreichen Übermittlung eines Formulars oder nachdem ein Benutzer authentifiziert wurde, einen HTTP 302 Found
-Header. Bei allen anderen Versuchen, auf eine andere Seite oder Site umzuleiten, sendet das Framework einen HTTP 301 Moved Permanently
.
Zur Laufzeit generiert Fat-Free automatisch einen HTTP-404-Fehler, wenn festgestellt wird, dass eine eingehende HTTP-Anfrage mit keiner der in Ihrer Anwendung definierten Routen übereinstimmt. Es gibt jedoch Fälle, in denen Sie es selbst auslösen müssen.
Nehmen Sie zum Beispiel eine Route, die als GET /dogs/@breed
definiert ist. Ihre Anwendungslogik umfasst möglicherweise das Durchsuchen einer Datenbank und den Versuch, den Datensatz abzurufen, der dem Wert von @breed
in der eingehenden HTTP-Anfrage entspricht. Da Fat-Free aufgrund des Vorhandenseins des @breed
-Tokens jeden Wert nach dem Präfix /dogs/
akzeptiert, ist die programmgesteuerte Anzeige einer HTTP 404 Not Found
-Meldung erforderlich, wenn das Programm keine Übereinstimmung in unserer Datenbank findet. Verwenden Sie dazu den folgenden Befehl:-
$ f3 -> error ( 404 );
Die Architektur von Fat-Free basiert auf dem Konzept, dass HTTP-URIs abstrakte Webressourcen darstellen (nicht auf HTML beschränkt) und jede Ressource von einem Anwendungsstatus in einen anderen wechseln kann. Aus diesem Grund unterliegt F3 keinerlei Einschränkungen hinsichtlich der Strukturierung Ihrer Bewerbung. Wenn Sie lieber das Model-View-Controller-Muster verwenden möchten, kann Ihnen F3 dabei helfen, Ihre Anwendungskomponenten zu unterteilen, um diesem Paradigma beizubehalten. Andererseits unterstützt das Framework auch das Ressourcen-Methoden-Darstellungsmuster und die Implementierung ist einfacher.
Hier ist ein Beispiel für eine ReST-Schnittstelle:-
class Item {
function get () {}
function post () {}
function put () {}
function delete () {}
}
$ f3 = require ( ' lib/base.php ' );
$ f3 -> map ( ' /cart/@item ' , ' Item ' );
$ f3 -> run ();
Die Methode $f3->map()
von Fat-Free stellt eine ReST-Schnittstelle bereit, indem sie HTTP-Methoden in Routen den entsprechenden Methoden eines Objekts oder einer PHP-Klasse zuordnet. Wenn Ihre Anwendung eine eingehende HTTP-Anfrage wie GET /cart/123
empfängt, überträgt Fat-Free die Steuerung automatisch an die get()
Methode des Objekts oder der Klasse. Andererseits wird eine POST /cart/123
-Anfrage an die post()
Methode der Item
-Klasse weitergeleitet.
Hinweis: Browser implementieren die HTTP-Methoden PUT
und DELETE
nicht in regulären HTML-Formularen. Auf diese und andere ReST-Methoden ( HEAD
und CONNECT
) kann nur über AJAX-Aufrufe an den Server zugegriffen werden.
Wenn das Framework eine HTTP-Anfrage für eine Route empfängt, die einer Methode zugeordnet ist, die nicht von einer Klasse implementiert wird (vielleicht haben Sie einen Fehler bei der Routenzuordnung gemacht oder die Methode ist noch nicht geschrieben), generiert es eine HTTP 405 Method Not Allowed
Fehler HTTP 405 Method Not Allowed
.
Wenn ein Client HTTP- OPTIONS
für eine URL-Ressource anfordert, antwortet F3 mit den entsprechenden HTTP-Headern, die angeben, welche Methoden für die Ressource zulässig sind (HEAD, GET, PUT usw.). Das Framework ordnet die OPTIONS
-Anfrage keiner Klasse zu.
Fat-Free bietet die Möglichkeit, Klassen nur dann zu laden, wenn Sie sie benötigen, sodass sie nicht mehr Speicher beanspruchen, als ein bestimmtes Segment Ihrer Anwendung benötigt. Und Sie müssen keine lange Liste von include
oder require
-Anweisungen schreiben, nur um PHP-Klassen zu laden, die in verschiedenen Dateien und an verschiedenen Orten gespeichert sind. Das Framework kann dies automatisch für Sie erledigen. Speichern Sie einfach Ihre Dateien (eine Klasse pro Datei) in einem Ordner und weisen Sie das Framework an, die entsprechende Datei automatisch zu laden, sobald Sie eine Methode in der Klasse aufrufen:-
$ f3 -> set ( ' AUTOLOAD ' , ' autoload/ ' );
Sie können Ihren automatisch geladenen Klassen einen anderen Speicherort zuweisen, indem Sie den Wert der globalen Variablen AUTOLOAD
ändern. Sie können auch mehrere Autoload-Pfade haben. Wenn Sie Ihre Klassen organisiert und in verschiedenen Ordnern haben, können Sie das Framework anweisen, die entsprechende Klasse automatisch zu laden, wenn eine statische Methode aufgerufen oder ein Objekt instanziiert wird. Ändern Sie die AUTOLOAD
Variable wie folgt:
$ f3 -> set ( ' AUTOLOAD ' , ' admin/autoload/; user/autoload/; default/ ' );
Wichtig: Mit Ausnahme der Erweiterung .php müssen der Klassenname und der Dateiname identisch sein, damit das Framework Ihre Klasse ordnungsgemäß automatisch lädt. Der Basisname dieser Datei muss mit Ihrem Klassenaufruf identisch sein, z. B. sucht F3 entweder nach Foo/BarBaz.php
oder foo/barbaz.php
wenn es eine new FooBarBaz
-Anweisung in Ihrer Anwendung erkennt.
AUTOLOAD
können sich Klassenhierarchien in Unterordnern mit ähnlichen Namen befinden. Wenn Sie also möchten, dass das Framework eine Namespace-Klasse automatisch lädt, die auf folgende Weise aufgerufen wird:
$ f3 -> set ( ' AUTOLOAD ' , ' autoload/ ' );
$ obj = new Gadgets iPad ;
Sie können eine Ordnerhierarchie erstellen, die derselben Struktur folgt. Angenommen, /var/www/html/
ist Ihr Web-Root, dann sucht F3 nach der Klasse in /var/www/html/autoload/gadgets/ipad.php
. Die Datei ipad.php
sollte den folgenden Mindestcode haben:-
namespace Gadgets ;
class iPad {}
Denken Sie daran: Alle Verzeichnisnamen in Fat-Free müssen mit einem Schrägstrich enden. Sie können dem Autoloader wie folgt einen Suchpfad zuweisen:-
$ f3 -> set ( ' AUTOLOAD ' , ' main/;aux/ ' );
Da F3 ein Namespace-fähiges Framework ist, können Sie eine Methode in einer Namespace-Klasse als Routenhandler verwenden, und es gibt mehrere Möglichkeiten, dies zu tun. So rufen Sie eine statische Methode auf: –
$ f3 -> set ( ' AUTOLOAD ' , ' classes/ ' );
$ f3 -> route ( ' GET|POST / ' , ' MainHome::show ' );
Der obige Code ruft die statische show()
-Methode der Klasse Home
im Main
-Namespace auf. Damit die Home
-Klasse automatisch geladen wird, muss sie im Ordner classes/main/home.php
gespeichert werden.
Wenn Sie lieber mit Objekten arbeiten:-
$ f3 -> route ( ' GET|POST / ' , ' MainHome->show ' );
instanziiert die Home
-Klasse zur Laufzeit und ruft anschließend die Methode show()
auf.
F3 verfügt über einige Routing-Ereignis-Listener, die Ihnen dabei helfen können, den Ablauf und die Struktur von Controller-Klassen zu verbessern. Angenommen, Sie haben eine Route wie folgt definiert:-
$ f3 -> route ( ' GET / ' , ' Main->home ' );
Wenn die Anwendung eine HTTP-Anfrage empfängt, die der oben genannten Route entspricht, instanziiert F3 Main
, aber bevor die Methode home()
ausgeführt wird, sucht das Framework in dieser Klasse nach einer Methode mit dem Namen beforeRoute()
. Falls es gefunden wird, führt F3 den im beforeRoute()
Ereignishandler enthaltenen Code aus, bevor die Steuerung an die home()
Methode übergeben wird. Sobald dies erledigt ist, sucht das Framework nach einem afterRoute()
-Ereignishandler. Wie beforeRoute()
wird die Methode ausgeführt, wenn sie definiert ist.
Hier ist ein weiteres F3-Goodie:-
$ f3 -> route ( ' GET /products/@action ' , ' Products->@action ' );
Wenn Ihre Anwendung beispielsweise eine Anfrage für /products/itemize
erhält, extrahiert F3 die Zeichenfolge 'itemize'
aus der URL und übergibt sie an das @action
Token im Routenhandler. F3 sucht dann nach einer Klasse namens Products
und führt die Methode itemize()
aus.
Dynamische Routenhandler können verschiedene Formen haben:
// static method
$ f3 -> route ( ' GET /public/@genre ' , ' Main::@genre ' );
// object mode
$ f3 -> route ( ' GET /public/@controller/@action ' , ' @controller->@action ' );
F3 löst zur Laufzeit den Fehler HTTP 404 Not Found
aus, wenn die Steuerung nicht an die Klasse oder Methode übertragen werden kann, die der aktuellen Route zugeordnet ist, also an eine undefinierte Klasse oder Methode.
Routing-Muster können Modifikatoren enthalten, die das Framework anweisen, seine Routing-Entscheidung auf der Art der HTTP-Anfrage zu basieren:
$ f3 -> route ( ' GET /example [ajax] ' , ' Page->getFragment ' );
$ f3 -> route ( ' GET /example [sync] ' , ' Page->getFull ' );
Die erste Anweisung leitet die HTTP-Anfrage nur dann an den Page->getFragment()
-Rückruf weiter, wenn ein X-Requested-With: XMLHttpRequest
Header (AJAX-Objekt) vom Server empfangen wird. Wenn eine gewöhnliche (synchrone) Anfrage erkannt wird, springt F3 einfach zum nächsten passenden Muster und führt in diesem Fall den Page->getFull()
-Rückruf aus.
Wenn in einem Routingmuster keine Modifikatoren definiert sind, werden sowohl AJAX- als auch synchrone Anforderungstypen an den angegebenen Handler weitergeleitet.
Routenmustermodifikatoren werden auch von $f3->map()
erkannt.
In Fat-Free definierte Variablen sind global, das heißt, auf sie kann von jeder MVC-Komponente zugegriffen werden. Framework-Globals sind nicht identisch mit PHP-Globals. Eine F3-Variable namens content
ist nicht identisch mit PHPs $content
. F3 ist eine eigenständige domänenspezifische Sprache und verwaltet eine eigene separate Symboltabelle für System- und Anwendungsvariablen. Das Framework belastet, wie jedes gut gestaltete objektorientierte Programm, den globalen PHP-Namespace nicht mit Konstanten, Variablen, Funktionen oder Klassen, die mit jeder Anwendung in Konflikt geraten könnten. Im Gegensatz zu anderen Frameworks verwendet F3 nicht die Anweisung define()
von PHP. Alle Framework-Konstanten sind auf Klassen beschränkt.
So weisen Sie einer fettfreien Variablen einen Wert zu:
$ f3 -> set ( ' var ' ,value); // or
$ f3 -> var =value;
$ f3 -> set ( ' hello.world ' , ' good morning ' ); // translates to : 'hello' == array ( 'world' = > 'good morning' )
$ f3 ->{ ' hello.world ' }= ' good morning ' ; // same as prior statement
Hinweis: Fat-Free-Variablen akzeptieren alle PHP-Datentypen, einschließlich Objekte und anonyme Funktionen.
Um mehrere Variablen gleichzeitig festzulegen:
$ f3 -> mset (
[
' foo ' => ' bar ' ,
' baz ' => 123
]
);
So rufen Sie den Wert einer Framework-Variablen namens var
ab:-
echo $ f3 -> get ( ' var ' ); // or
echo $ f3 -> var ;
Um eine Fat-Free-Variable aus dem Speicher zu entfernen, wenn Sie sie nicht mehr benötigen (verwerfen Sie sie, damit sie Ihre anderen Funktionen/Methoden nicht beeinträchtigt), verwenden Sie die Methode:
$ f3 -> clear ( ' var ' ); // or
unset( $ f3 -> var );
Um herauszufinden, ob eine Variable bereits zuvor definiert wurde:
$ f3 -> exists ( ' var ' ) //
isset ( $ f3 -> var )
F3 unterhält eine eigene Symboltabelle für Framework- und Anwendungsvariablen, die unabhängig von PHPs sind. Einige Variablen werden PHP-Globals zugeordnet. SESSION
von Fat-Free entspricht $_SESSION
und REQUEST
ist $_REQUEST
zugeordnet. Anstelle von PHP wird die Verwendung von Framework-Variablen empfohlen, um Sie bei der Datenübertragung zwischen verschiedenen Funktionen, Klassen und Methoden zu unterstützen. Sie haben auch andere Vorteile:-
SESSION
ändert sich auch PHPs zugrunde liegendes $_SESSION
. Durch eine Änderung des letzteren ändert sich auch das Framework-Gegenstück. Fat-Free verwaltet nicht nur einen bloßen Speicher für Variablen und ihre Werte. Es kann auch die Sitzungsverwaltung und andere Dinge automatisieren. Durch Zuweisen oder Abrufen eines Werts über SESSION
Variable von F3 wird die Sitzung automatisch gestartet. Wenn Sie $_SESSION
(oder sitzungsbezogene Funktionen) direkt anstelle der Framework-Variablen SESSION
verwenden, wird Ihre Anwendung für die Verwaltung von Sitzungen verantwortlich.
In der Regel bleiben Framework-Variablen zwischen HTTP-Anfragen nicht bestehen. Nur SESSION
und COOKIE
(und ihre Elemente), die den globalen Variablen $_SESSION
und $_COOKIE
von PHP zugeordnet sind, sind von der zustandslosen Natur von HTTP ausgenommen.
Es gibt mehrere vordefinierte globale Variablen, die intern von Fat-Free verwendet werden, und Sie können sie sicherlich in Ihrer Anwendung verwenden. Stellen Sie sicher, dass Sie wissen, was Sie tun. Das Ändern einiger globaler Fat-Free-Variablen kann zu unerwartetem Framework-Verhalten führen.
Das Framework verfügt über mehrere Variablen, die Ihnen dabei helfen, Ihre Dateien und Verzeichnisstrukturen zu organisieren. Wir haben gesehen, wie wir das Laden von Klassen mithilfe von AUTOLOAD
automatisieren können. Es gibt eine globale Variable UI
, die den Pfad enthält, der auf den Speicherort Ihrer HTML-Ansichten/Vorlagen verweist. DEBUG
ist eine weitere Variable, die Sie während der Anwendungsentwicklung häufig verwenden und zum Festlegen der Ausführlichkeit von Fehlerspuren verwendet wird.
Wenn Sie eine umfassende Liste der integrierten Framework-Variablen benötigen, lesen Sie die Kurzreferenz.
Eine Rahmenvariable kann beliebig viele Buchstaben, Ziffern und Unterstriche enthalten. Es muss mit einem Buchstaben beginnen und darf keine Leerzeichen enthalten. Bei Variablennamen muss die Groß-/Kleinschreibung beachtet werden.
F3 verwendet Großbuchstaben für interne vordefinierte globale Variablen. Nichts hindert Sie daran, in Ihrem eigenen Programm Variablennamen zu verwenden, die ausschließlich aus Großbuchstaben bestehen. Halten Sie sich jedoch grundsätzlich an die Kleinschreibung (oder CamelCase), wenn Sie Ihre eigenen Variablen einrichten, damit Sie mögliche Konflikte mit aktuellen und zukünftigen Framework-Releases vermeiden können .
Sie sollten keine PHP-reservierten Wörter wie if
, for
, class
, default
usw. als Framework-Variablennamen verwenden. Diese können zu unvorhersehbaren Ergebnissen führen.
F3 bietet außerdem eine Reihe von Tools, die Sie bei Framework-Variablen unterstützen.
$ f3 -> set ( ' a ' , ' fire ' );
$ f3 -> concat ( ' a ' , ' cracker ' );
echo $ f3 -> get ( ' a ' ); // returns the string 'firecracker'
$ f3 -> copy ( ' a ' , ' b ' );
echo $ f3 -> get ( ' b ' ); // returns the same string : 'firecracker'
F3 bietet auch einige einfache Methoden zum Arbeiten mit Array-Variablen:
$ f3 -> set ( ' colors ' ,[ ' red ' , ' blue ' , ' yellow ' ]);
$ f3 -> push ( ' colors ' , ' green ' ); // works like PHP ' s array_push ()
echo $ f3 -> pop ( ' colors ' ); // returns 'green'
$ f3 -> unshift ( ' colors ' , ' purple ' ); // similar to array_unshift ()
echo $ f3 -> shift ( ' colors ' ); // returns 'purple'
$ f3 -> set ( ' grays ' ,[ ' light ' , ' dark ' ]);
$ result = $ f3 -> merge ( ' colors ' , ' grays ' ); // merges the two arrays
Im Gegensatz zu anderen Frameworks mit starren Ordnerstrukturen bietet Ihnen F3 viel Flexibilität. Sie können eine Ordnerstruktur haben, die wie folgt aussieht (Wörter in Klammern in Großbuchstaben stellen die F3-Framework-Variablen dar, die angepasst werden müssen): –
/ (your Web root, where index.php is located)
app/ (application files)
dict/ (LOCALES, optional)
controllers/
logs/ (LOGS, optional)
models/
views/ (UI)
css/
js/
lib/ (you can store base.php here)
tmp/ (TEMP, used by the framework)
cache/ (CACHE)
Organisieren Sie Ihre Dateien und Verzeichnisse ganz nach Ihren Wünschen. Legen Sie einfach die entsprechenden globalen F3-Variablen fest. Wenn Sie eine wirklich sichere Website wünschen, können Sie mit Fat-Free sogar alle Ihre Dateien in einem nicht über das Internet zugänglichen Verzeichnis speichern. Die einzige Voraussetzung ist, dass Sie index.php
, .htaccess
und Ihre öffentlichen Dateien wie CSS, JavaScript, Bilder usw. in einem für Ihren Browser sichtbaren Pfad belassen.
Fat-Free generiert eigene HTML-Fehlerseiten mit Stack-Traces, die Sie beim Debuggen unterstützen. Hier ist ein Beispiel:-
interner Serverfehler
strpos() erwartet mindestens 2 Parameter, 0 gegeben
• var/html/dev/main.php:96 strpos() • var/html/dev/index.php:16 Base->run()
Wenn Sie der Meinung sind, dass es etwas zu einfach ist oder Sie andere Dinge tun möchten, wenn der Fehler auftritt, können Sie Ihren eigenen benutzerdefinierten Fehlerhandler erstellen:
$ f3 -> set ( ' ONERROR ' ,
function ( $ f3 ) {
// custom error handler code goes here
// use this if you want to display errors in a
// format consistent with your site ' s theme
echo $ f3 -> get ( ' ERROR.status ' );
}
);
F3 verwaltet eine globale Variable, die die Details des letzten Fehlers enthält, der in Ihrer Anwendung aufgetreten ist. Die Variable ERROR
ist ein Array mit der folgenden Struktur:
ERROR.code - displays the error code (404, 500, etc.)
ERROR.status - header and page title
ERROR.text - error context
ERROR.trace - stack trace
Während der Entwicklung Ihrer Anwendung ist es am besten, die Debug-Stufe auf Maximum zu setzen, damit Sie alle Fehler auf ihre Grundursache zurückführen können:-
$ f3 -> set ( ' DEBUG ' , 3 );
Fügen Sie den Befehl einfach in die Bootstrap-Sequenz Ihrer Anwendung ein.
Sobald Ihre Bewerbung zur Veröffentlichung bereit ist, entfernen Sie einfach die Erklärung aus Ihrer Bewerbung oder ersetzen Sie sie durch:-
$ f3 -> set ( ' DEBUG ' , 0 );
Dadurch wird die Stack-Trace-Ausgabe auf allen vom System generierten HTML-Fehlerseiten unterdrückt (da diese nicht für die Besucher Ihrer Website gedacht ist).
DEBUG
kann Werte im Bereich von 0 (Stack-Trace unterdrückt) bis 3 (am ausführlichsten) haben.
Nicht vergessen! Stacktraces können Pfade, Dateinamen, Datenbankbefehle, Benutzernamen und Passwörter enthalten. Wenn Sie die globale Variable DEBUG
in einer Produktionsumgebung nicht auf 0 setzen, setzen Sie Ihre Website möglicherweise unnötigen Sicherheitsrisiken aus.
Wenn Ihre Anwendung vom Benutzer konfigurierbar sein muss, bietet F3 eine praktische Methode zum Lesen von Konfigurationsdateien zum Einrichten Ihrer Anwendung. Auf diese Weise können Sie und Ihre Benutzer die Anwendung optimieren, ohne PHP-Code zu ändern.
Anstatt ein PHP-Skript zu erstellen, das den folgenden Beispielcode enthält:-
$ f3 -> set ( ' num ' , 123 );
$ f3 -> set ( ' str ' , ' abc ' );
$ f3 -> set ( ' hash ' ,[ ' x ' => 1 , ' y ' => 2 , ' z ' => 3 ]);
$ f3 -> set ( ' items ' ,[ 7 , 8 , 9 ]);
$ f3 -> set ( ' mix ' ,[ ' this ' , 123.45 , FALSE ]);
Sie können eine Konfigurationsdatei erstellen, die dasselbe tut:
[globals]
num =123
; this is a regular string
str =abc
; another way of assigning strings
str = " abc "
; this is an array
hash[x]=1
hash[y]=2
hash[z]=3
; dot-notation is recognized too
hash.x =1
hash.y =2
hash.z =3
; this is also an array
items =7,8,9
; array with mixed elements
mix = " this " ,123.45,FALSE
Anstelle langwieriger $f3->set()
Anweisungen in Ihrem Code können Sie das Framework anweisen, eine Konfigurationsdatei als Codeersatz zu laden. Speichern wir den obigen Text als setup.cfg. Wir können es dann mit einem einfachen Aufruf aufrufen:
$ f3 -> config ( ' setup.cfg ' );
Zeichenfolgenwerte müssen nicht in Anführungszeichen gesetzt werden, es sei denn, Sie möchten führende oder nachgestellte Leerzeichen enthalten. Wenn ein Komma als Teil einer Zeichenfolge behandelt werden soll, schließen Sie die Zeichenfolge in doppelte Anführungszeichen ein. Andernfalls wird der Wert als Array behandelt (das Komma wird als Trennzeichen für Array-Elemente verwendet). Zeichenfolgen können sich über mehrere Zeilen erstrecken:-
[globals]
str = " this is a
very long
string "
F3 gibt Ihnen auch die Möglichkeit, HTTP-Routen in Konfigurationsdateien zu definieren:-
[routes]
GET /=home
GET / 404 =App->page404
GET /page/@ num =Page->@controller
Routenkarten können auch in Konfigurationsdateien definiert werden:-
[maps]
/ blog =BlogLogin
/blog/@ controller =Blog@controller
Die Abschnittsüberschriften [globals]
, [routes]
und [maps]
sind erforderlich. Sie können beide Abschnitte in einer einzigen Konfigurationsdatei kombinieren – es wird jedoch empfohlen, [routes]
und [maps]
in einer separaten Datei zu haben. Auf diese Weise können Sie Endbenutzern erlauben, einige anwendungsspezifische Flags zu ändern und sie gleichzeitig daran hindern, sich in Ihre Routing-Logik einzumischen.
Eine Benutzeroberfläche wie eine HTML-Seite sollte in Bezug auf Routing und Geschäftslogik unabhängig vom zugrunde liegenden PHP-Code sein. Dies ist grundlegend für das MVC-Paradigma. Eine grundlegende Überarbeitung wie die Konvertierung <h3>
in <p>
sollte keine Änderung Ihres Anwendungscodes erfordern. Ebenso sollte die Umwandlung einer einfachen Route wie GET /about
in GET /about-us
keine Auswirkungen auf Ihre Benutzeroberfläche und Geschäftslogik haben (die Ansicht und das Modell in MVC oder die Darstellung und Methode in RMR).
Mischungsprogrammierkonstrukte und Benutzeroberflächenkomponenten in einer einzelnen Datei wie Spaghetti -Codierung machen die zukünftige Anwendungswartung zu einem Albtraum.
F3 unterstützt PHP als Template -Engine. Schauen Sie sich dieses als Vorlage gespeicherte HTML-Fragment template.htm
:-.
< p > Hello, < ?php echo $name; ? > ! </ p >
Wenn kurze Tags auf Ihrem Server aktiviert sind, sollte dies auch funktionieren:-
< p > Hello, < ?= $name ? > </ p >
Um diese Vorlage anzuzeigen, können Sie PHP-Code haben, der so aussieht (in einer von der Vorlage getrennten Datei gespeichert):-
$ f3 = require ( ' lib/base.php ' );
$ f3 -> route ( ' GET / ' ,
function ( $ f3 ) {
$ f3 -> set ( ' name ' , ' world ' );
$ view = new View ;
echo $ view -> render ( ' template.htm ' );
// Previous two lines can be shortened to : -
// echo View :: instance () - > render ( 'template.htm' );
}
);
$ f3 -> run ();
Das einzige Problem bei der Verwendung von PHP als Vorlagen -Engine aufgrund des eingebetteten PHP -Code in diesen Dateien ist die bewusste Anstrengung, die erforderlich ist, um sich an die Richtlinien zur Trennung von Bedenken zu halten und der Versuchung des Mischens der Geschäftslogik mit Ihrer Benutzeroberfläche zu widerstehen.
Als Alternative zu PHP können Sie die eigene Vorlagenmotor von F3 verwenden. Das obige HTML-Fragment kann als:- umgeschrieben werden:-
< p > Hello, {{ @name }}! </ p >
und der Code, der für die Anzeige dieser Vorlage erforderlich ist:-
$ f3 = require ( ' lib/base.php ' );
$ f3 -> route ( ' GET / ' ,
function ( $ f3 ) {
$ f3 -> set ( ' name ' , ' world ' );
$ template = new Template ;
echo $ template -> render ( ' template.htm ' );
// Above lines can be written as : -
// echo Template :: instance () - > render ( 'template.htm' );
}
);
$ f3 -> run ();
Wie Routing -Token, die zum Fangen von Variablen in URLs verwendet werden (erinnern Sie sich noch das Beispiel GET /brew/@count
im vorherigen Abschnitt?) F3 -Vorlagen -Token beginnen mit dem @
-Symbol, gefolgt von einer Reihe von Buchstaben und Ziffern, die in lockigen Klammern eingeschlossen sind. Der erste Charakter muss Alpha sein. Template-Token haben eine Eins-zu-Eins-Korrespondenz mit Framework-Variablen. Das Framework ersetzt automatisch ein Token durch den Wert, der in einer gleichnamigen Variablen gespeichert ist.
In unserem Beispiel ersetzt F3 das @name
-Token in unserer Vorlage durch den Wert, den wir der Namensvariablen zugewiesen haben. Zur Laufzeit ist die Ausgabe des obigen Codes:-
< p > Hello, world </ p >
Besorgt über die Leistung von F3 -Vorlagen? Zur Laufzeit analysiert und kompiliert/konvertiert das Framework eine F3-Vorlage in PHP-Code, wenn sie zum ersten Mal über $template->render()
angezeigt wird. Das Framework verwendet dann diesen kompilierten Code in allen nachfolgenden Aufrufen. Die Leistung sollte daher mit PHP -Vorlagen übereinstimmen, wenn nicht besser aufgrund der Codeoptimierung des Vorlagen -Compilers, wenn komplexere Vorlagen beteiligt sind.
Unabhängig davon, ob Sie PHPs Template Engine oder F3s eigene verwenden, kann das Template -Rendering erheblich schneller sein, wenn Sie APC, Wincache oder XCache auf Ihrem Server verfügbar haben.
Wie bereits erwähnt, können Framework -Variablen einen beliebigen PHP -Datentyp halten. Die Verwendung nicht-Scalar-Datentypen in F3-Vorlagen kann jedoch seltsame Ergebnisse erzielen, wenn Sie nicht vorsichtig sind. Ausdrücke in lockigen Klammern werden immer bewertet und in die String umgewandelt. Sie sollten Ihre Benutzeroberflächenvariablen auf einfache Skalare beschränken:- string
, integer
, boolean
oder float
-Datentypen.
Aber was ist mit Arrays? Fettfrei erkennt Arrays und Sie können sie in Ihren Vorlagen einsetzen. Sie können so etwas haben wie:-
< p > {{ @buddy[0] }}, {{ @buddy[1] }}, and {{ @buddy[2] }} </ p >
Und bevölkern Sie das @buddy
Array in Ihrem PHP-Code, bevor Sie die Vorlage bedienen:-
$ f3 -> set ( ' buddy ' ,[ ' Tom ' , ' Dick ' , ' Harry ' ]);
Wenn Sie jedoch einfach {{ @buddy }}
in Ihre Vorlage einfügen, ersetzt PHP es durch 'Array'
da es das Token in eine Zeichenfolge umwandelt. PHP hingegen generiert zur Laufzeit ein Array to string conversion
-Hinweis.
Mit F3 können Sie Ausdrücke in Vorlagen einbetten. Diese Ausdrücke können verschiedene Formen annehmen, z.
{{ 2*(@page-1) }}
{{ (int)765.29+1.2e3 }}
< option value =" F " {{ @active? 'selected=" selected "':'' }} > Female </ option >
{{ var_dump(@xyz) }}
< p > That is {{ preg_match('/Yes/i',@response)?'correct':'wrong' }}! </ p >
{{ @obj- > property }}
Ein zusätzlicher Hinweis zu Array -Ausdrücken: Beachten Sie, dass @foo.@bar
eine String -Verkettung $foo.$bar
) ist, während @foo.bar
$foo['bar']
übersetzt. Wenn $foo[$bar]
das ist, was Sie beabsichtigt haben, verwenden Sie die reguläre Notation @foo[@bar]
.
Framework -Variablen können auch anonyme Funktionen enthalten:
$ f3 -> set ( ' func ' ,
function ( $ a , $ b ) {
return $ a . ' , ' . $ b ;
}
);
Die F3 -Template -Engine interpretiert das Token wie erwartet, wenn Sie den folgenden Ausdruck angeben:
{{ @func('hello','world') }}
Einfache variable Substitution ist eine Sache, die alle Vorlagenmotoren haben. Fettfrei hat mehr die Ärmel:-
< include href =" header.htm " />
Die Richtlinie wird den Inhalt der Header.htm -Vorlage an der genauen Position einbetten, in der die Anweisung angegeben ist. Sie können auch dynamische Inhalte in Form von:- haben:-
< include href =" {{ @content }} " />
Eine praktische Verwendung für eine solche Vorlagenanweisung ist, wenn Sie mehrere Seiten mit einem gemeinsamen HTML -Layout, jedoch mit unterschiedlichem Inhalt haben. Das Anweisen des Frameworks zum Einfügen eines Untertemplats in Ihre Hauptvorlage ist so einfach wie das Schreiben des folgenden Php-Code:-
// switch content to your blog sub - template
$ f3 -> set ( ' content ' , ' blog.htm ' );
// in another route , switch content to the wiki sub - template
$ f3 -> set ( ' content ' , ' wiki.htm ' );
Eine Untervorlage kann wiederum eine beliebige Anzahl von Richtlinien enthalten. F3 erlaubt unbegrenzte verschachtelte Vorlagen.
Sie können Dateinamen mit etwas anderem als .htm- oder .html -Dateiverlängerungen angeben. Während der Entwicklung und Debugging -Phase ist es einfacher, sie in Ihrem Webbrowser anzunehmen. Die Template -Engine ist nicht darauf beschränkt, HTML -Dateien zu rendern. Tatsächlich können Sie die Vorlagen -Engine verwenden, um andere Arten von Dateien zu rendern.
Die <include>
einfügungsanweisung hat auch ein optionales if
Attribut, sodass Sie eine Bedingung angeben können, die erfüllt werden muss, bevor das Unter-Template eingefügt wird:-
< include if =" {{ count(@items) }} " href =" items.htm " />
Während des Schreibens/Debuggens von F3-Anbieterprogrammen und -entwicklung Vorlagen kann es Fälle geben, wenn die Anzeige eines HTML-Blocks nützlich sein kann. Sie können für diesen Zweck die <exclude>
Richtlinie verwenden:-
< exclude >
< p > A chunk of HTML we don't want displayed at the moment </ p >
</ exclude >
Das ist wie der <!-- comment -->
HTML-Kommentar-Tag, aber die <exclude>
-Richtlinie macht den HTML-Block nach dem Rendern der Vorlage völlig unsichtbar.
Hier ist eine andere Möglichkeit, Vorlageninhalte auszuschließen oder Kommentare hinzuzufügen:-
{* < p > A chunk of HTML we don't want displayed at the moment </ p > *}
Eine weitere nützliche Vorlagefunktion ist die <check>
-Direktive. Es ermöglicht Ihnen, ein HTML -Fragment abhängig von der Bewertung eines bestimmten Zustands einzubetten. Hier sind einige Beispiele:-
< check if =" {{ @page=='Home' }} " >
< false > < span > Inserted if condition is false </ span > </ false >
</ check >
< check if =" {{ @gender=='M' }} " >
< true >
< div > Appears when condition is true </ div >
</ true >
< false >
< div > Appears when condition is false </ div >
</ false >
</ check >
Sie können so viele verschachtelte <check>
Richtlinien haben, wie Sie benötigen.
Ein F3 -Ausdruck in einem IF -Attribut, das NULL
entspricht, eine leere Zeichenfolge, ein boolescher FALSE
, ein leeres Array oder Null, ruft automatisch <false>
auf. Wenn Ihre Vorlage keinen <false>
-Block hat, sind die Tags <true>
Öffnen und Schließen optional:-
< check if =" {{ @loggedin }} " >
< p > HTML chunk to be included if condition is true </ p >
</ check >
Fettfrei kann auch wiederholte HTML-Blöcke verarbeiten:-
< repeat group =" {{ @fruits }} " value =" {{ @fruit }} " >
< p > {{ trim(@fruit) }} </ p >
</ repeat >
Das group
@fruits
in der <repeat>
-Verrichtlinie muss ein Array sein und sollte in Ihrem PHP-Code entsprechend eingestellt werden:-
$ f3 -> set ( ' fruits ' ,[ ' apple ' , ' orange ' , ' banana ' ]);
Es wird nichts gewonnen, indem @fruit
in Ihrem Anwendungscode ein Wert zugewiesen wird. Fettfrei ignoriert jeden voreingestellten Wert, den er haben kann, da die Variable die aktuelle Element während der Iteration über die Gruppe darstellt. Die Ausgabe des obigen HTML-Template-Fragments und der entsprechende PHP-Code wird:-
< p > apple </ p >
< p > orange </ p >
< p > banana </ p >
Das Framework ermöglicht eine unbegrenzte Verachtung von <repeat>
Blöcken:-
< repeat group =" {{ @div }} " key =" {{ @ikey }} " value =" {{ @idiv }} " >
< div >
< p > < span > < b > {{ @ikey }} </ b > </ span > </ p >
< p >
< repeat group =" {{ @idiv }} " value =" {{ @ispan }} " >
< span > {{ @ispan }} </ span >
</ repeat >
</ p >
</ div >
</ repeat >
Wenden Sie den folgenden F3-Befehl an:-
$ f3 -> set ( ' div ' ,
[
' coffee ' =>[ ' arabica ' , ' barako ' , ' liberica ' , ' kopiluwak ' ],
' tea ' =>[ ' darjeeling ' , ' pekoe ' , ' samovar ' ]
]
);
Infolgedessen erhalten Sie das folgende HTML-Fragment:-
< div >
< p > < span > < b > coffee </ b > </ span > </ p >
< p >
< span > arabica </ span >
< span > barako </ span >
< span > liberica </ span >
< span > kopiluwak </ span >
< p >
</ div >
< div >
< p > < span > < b > tea </ b > </ span > </ p >
< p >
< span > darjeeling </ span >
< span > pekoe </ span >
< span > samovar </ span >
</ p >
</ div >
Erstaunlich, nicht wahr? Und das einzige, was Sie in PHP tun mussten, war, den Inhalt eines einzelnen F3 -Variablen div
zu definieren, um das @div
-Token zu ersetzen. Fettfrei macht sowohl das Programmieren als auch das Web-Vorlagen-Design wirklich einfach.
Das value
-Attribut der Template -Anweisung <repeat>
Die Richtlinie gibt den Wert des aktuellen Elements in der Iteration zurück. Wenn Sie die Array -Taste des aktuellen Elements abrufen müssen, verwenden Sie stattdessen das key
. Das key
ist optional.
<repeat>
hat auch ein optionales Zählerattribut, das wie folgt verwendet werden kann:-
< repeat group =" {{ @fruits }} " value =" {{ @fruit }} " counter =" {{ @ctr }} " >
< p class =" {{ @ctr%2?'odd':'even' }} " > {{ trim(@fruit) }} </ p >
</ repeat >
Innen zeichnet die Templat Engine von F3 die Anzahl der Schleifen -Iterationen auf und spart diesen Wert in der Variablen/Token @ctr
, die in unserem Beispiel verwendet wird, um die ungerade/gleichmäßige Klassifizierung zu bestimmen.
Wenn Sie F3-Token in einen Abschnitt <script>
oder <style>
Ihrer Vorlage einfügen müssen, ersetzt das Framework sie dennoch die übliche Weise:-
< script type =" text/javascript " >
function notify ( ) {
alert ( 'You are logged in as: {{ @userID }}' ) ;
}
</ script >
Die Einbetten von Vorlagenanweisungen in Ihr <script>
oder <style>
Tags erfordert keine besondere Handhabung:-
< script type =" text/javascript " >
var discounts = [ ] ;
< repeat group = "{{ @rates }}" value = "{{ @rate }}" >
// whatever you want to repeat in Javascript, e.g.
discounts.push(" { { @ rate } } ");
</ repeat >
</ script >
Standardmäßig verwendet fettfrei das UTF-8-Zeichensatz, sofern geändert. Sie können dieses Verhalten überschreiben, indem Sie so etwas wie folgt:-
$ f3 -> set ( ' ENCODING ' , ' ISO-8859-1 ' );
Sobald Sie das Framework über das gewünschte Zeichensatz informieren, verwendet F3 ihn in allen HTML- und XML -Vorlagen, bis sie erneut verändert sind.
Wie bereits in diesem Abschnitt erwähnt, ist das Framework nicht auf HTML -Vorlagen beschränkt. Sie können XML -Vorlagen genauso gut verarbeiten. Die Mechaniker sind ziemlich ähnlich. Sie haben immer noch das gleiche {{ @variable }}
und {{ expression }}
Token, <repeat>
, <check>
, <include>
und <exclude>
Anweisungen zur Verfügung. Sagen Sie einfach F3, dass Sie eine XML-Datei anstelle von HTML übergeben:-
echo Template:: instance ()-> render ( ' template.xml ' , ' application/xml ' );
Das zweite Argument repräsentiert den MIME -Typ des Dokuments, der wiedergegeben wird.
Die Ansichtskomponente von MVC deckt alles ab, was nicht unter das Modell und den Controller fällt, was bedeutet, dass Ihre Präsentation alle Arten von Benutzeroberflächen enthalten kann und sollte Im Folgenden zeigt Ihnen, wie Sie Ihre E-Mail-Präsentation von der Geschäftslogik Ihrer Anwendung trennen:-
MIME-Version: 1.0
Content-type: text/html; charset={{ @ENCODING }}
From: {{ @from }}
To: {{ @to }}
Subject: {{ @subject }}
< p > Welcome, and thanks for joining {{ @site }}! </ p >
Speichern Sie die obige E-Mail-Vorlage als Willkommen.txt. Der zugehörige F3-Code wäre:-
$ f3 -> set ( ' from ' , ' <[email protected]> ' );
$ f3 -> set ( ' to ' , ' <[email protected]> ' );
$ f3 -> set ( ' subject ' , ' Welcome ' );
ini_set ( ' sendmail_from ' , $ f3 -> get ( ' from ' ));
mail (
$ f3 -> get ( ' to ' ),
$ f3 -> get ( ' subject ' ),
Template:: instance ()-> render ( ' email.txt ' , ' text/html ' )
);
Tipp: Ersetzen Sie die Funktion SMTP Mail () durch IMAP_MAIL () Wenn Ihr Skript mit einem IMAP -Server kommuniziert.
Ist das nicht etwas? Wenn Sie ein Bündel von E-Mail-Empfängern haben, verwenden Sie natürlich eine Datenbank, um den FirstName-, Lastname- und E-Mail-Token zu füllen.
Hier ist eine alternative Lösung mit dem SMTP-Plug-In des F3:-
$ mail = new SMTP ( ' smtp.gmail.com ' , 465 , ' SSL ' , ' [email protected] ' , ' secret ' );
$ mail -> set ( ' from ' , ' <[email protected]> ' );
$ mail -> set ( ' to ' , ' "Slasher" <[email protected]> ' );
$ mail -> set ( ' subject ' , ' Welcome ' );
$ mail -> send (Template:: instance ()-> render ( ' email.txt ' ));
F3 unterstützt mehrere Sprachen direkt außerhalb der Box.
Erstellen Sie zunächst eine Wörterbuchdatei mit der folgenden Struktur (eine Datei pro Sprache):-
<?php
return [
' love ' => ' I love F3 ' ,
' today ' => ' Today is {0,date} ' ,
' pi ' => ' {0,number} ' ,
' money ' => ' Amount remaining: {0,number,currency} '
];
Speichern Sie es als dict/en.php
. Lassen Sie uns ein weiteres Wörterbuch erstellen, diesmal für Deutsch. Speichern Sie die Datei als dict/de.php
:-
<?php
return [
' love ' => ' Ich liebe F3 ' ,
' today ' => ' Heute ist {0,date} ' ,
' money ' => ' Restbetrag: {0,number,currency} '
];
Wörterbücher sind nichts anderes als Schlüsselwertpaare. F3 instanziiert automatisch Framework -Variablen basierend auf den Schlüssel in den Sprachdateien. Als solches ist es einfach, diese Variablen wie Token in Ihre Vorlagen einzubetten. Verwenden der F3-Template-Engine:-
< h1 > {{ @love }} </ h1 >
< p >
{{ @today,time() | format }}. < br />
{{ @money,365.25 | format }} < br />
{{ @pi }}
</ p >
Und die längere Version, die PHP als Vorlagenmotor verwendet:-
<?php $ f3 =Base:: instance (); ?>
<h1> <?php echo $ f3 -> get ( ' love ' ); ?> </h1>
<p>
<?php echo $ f3 -> get ( ' today ' , time ()); ?> .<br />
<?php echo $ f3 -> get ( ' money ' , 365.25 ); ?>
<?php echo $ f3 -> get ( ' pi ' ); ?>
</p>
Als nächstes unterweisen wir F3, nach Wörterbüchern im dict/
Ordner zu suchen:-
$ f3 -> set ( ' LOCALES ' , ' dict/ ' );
Aber wie bestimmt das Framework, welche Sprache zu verwenden ist? F3 erfasst es automatisch, indem sie sich zuerst die HTTP-Anforderungsheader ansehen, insbesondere den vom Browser gesendeten Accept-Language
Header.
Um dieses Verhalten zu überschreiben, können Sie F3 für die Verwendung einer vom Benutzer oder der Anwendung angegebenen Sprache auslösen:-
$ f3 -> set ( ' LANGUAGE ' , ' de ' );
Hinweis: Im obigen Beispiel existiert der Schlüssel -PI nur im englischen Wörterbuch. Das Framework verwendet immer Englisch ( en
) als Fallback, um Schlüssel zu fopulieren, die in der angegebenen (oder erkannten) Sprache nicht vorhanden sind.
Sie können auch Wörterbuchdateien für Sprachvarianten wie en-US
, es-AR
usw. erstellen. In diesem Fall verwendet F3 zuerst die Sprachvariante (wie es-AR
). Wenn in der Variante Schlüssel vorhanden ist, wird im Framework der Schlüssel in der Stammsprache ( es
) nachschlagen, und verwenden Sie die en
-Sprachdatei als endgültiger Fallback. Wörterbuch-Schlüssel-Wert-Paare werden nach dem Bezug zur Referenz zu F3-Variablen. Stellen Sie sicher, dass die Schlüssel nicht mit einer sofortigen Rahmenvariablen über $f3->set()
, $f3->mset()
oder $f3->config()
in Konflikt stehen.
Haben Sie bemerkt, dass das eigentümliche 'Today is {0,date}'
? Die mehrsprachige Fähigkeiten von F3 hängen auf String-/Nachrichtenformatierungsregeln des ICU -Projekts ab. Das Framework verwendet eine eigene Teilmenge der ICU -String -Formatierungsimplementierung. Es ist nicht erforderlich, dass die intl
-Erweiterung von PHP auf dem Server aktiviert wird.
Noch eine Sache: F3 kann auch mit formatierte Dateien im Stil von im Stil geladen werden:-
love = " I love F3 "
today = " Today is {0,date} "
pi = " {0,number} "
money = " Amount remaining: {0,number,currency} "
Speichern Sie es als dict/en.ini
damit das Framework es automatisch laden kann.
Standardmäßig entgeht sowohl die Handlerin als auch die Template -Engine alle gerenderten Variablen, dh in HTML -Entitäten umgewandelt, um Sie vor möglichen XSS- und Code -Injektionsangriffen zu schützen. Andererseits, wenn Sie gültige HTML-Fragmente aus Ihrem Anwendungscode an Ihre Vorlage übergeben möchten:-
$ f3 -> set ( ' ESCAPE ' , FALSE );
Dies kann unerwünschte Auswirkungen haben. Möglicherweise möchten Sie nicht, dass alle Variablen unabgeordnet sind. Mit fettfreiem Fett können Sie Variablen einzeln entlesen. Für F3-Vorlagen:-
{{ @html_content | raw }}
Im Fall von PHP-Vorlagen:-
<?php echo View:: instance ()-> raw ( $ html_content ); ?>
Als Ergänzung zur automatischen Aufteilung von F3-Variablen bietet das Framework auch eine freie Hand, um die Benutzereingabe aus HTML-Formularen zu sanieren:-
$ f3 -> scrub ( $ _GET , ' p; br; span; div; a ' );
In diesem Befehl werden alle Tags (mit Ausnahme der im zweiten Argument angegeben) und unsicheren Zeichen aus der angegebenen Variablen ausgezogen. Wenn die Variable ein Array enthält, wird jedes Element im Array rekursiv desinfiziert. Wenn ein Sternchen (*) als zweites Argument übergeben wird, ermöglicht $f3->scrub()
alle HTML-Tags, um unberührt zu durchlaufen und einfach unsichere Steuerzeichen zu entfernen.
FAT-Free ist so konzipiert, dass sie mit SQL-Datenbanken die Aufgabe machen. Wenn Sie nicht der Typ sind, der sich in Details zu SQL eintaucht, sondern sich mehr in Richtung Objektorientierter Datenhandhabung neigen, können Sie direkt zum nächsten Abschnitt dieses Tutorials gehen. Wenn Sie jedoch einige komplexe Datenbanken-Leistungsoptimierungsaufgaben ausführen müssen, ist SQL der richtige Weg.
Das Festlegen der Kommunikation mit einer SQL-Engine wie MySQL, SQLite, SQL Server, Sybase und Oracle erfolgt mit dem bekannten Befehl $f3->set()
. Die Verbindung zu einer SQLite-Datenbank wäre:-
$ db = new DB SQL ( ' sqlite:/absolute/path/to/your/database.sqlite ' );
Ein weiteres Beispiel: Diesmal mit MySQL:-
$ db = new DB SQL (
' mysql:host=localhost;port=3306;dbname=mysqldb ' ,
' admin ' ,
' p455w0rD '
);
OK. Das war einfach, nicht wahr? So würde man das Gleiche in gewöhnlichem PHP tun. Sie müssen nur das DSN -Format der Datenbank kennen, mit dem Sie eine Verbindung herstellen. Siehe den PDO -Abschnitt des PHP -Handbuchs.
Lassen Sie uns unseren PHP-Code fortsetzen:-
$ f3 -> set ( ' result ' , $ db -> exec ( ' SELECT brandName FROM wherever ' ));
echo Template:: instance ()-> render ( ' abc.htm ' );
Huh, was ist hier los? Sollten wir nicht Dinge wie PDOs, Aussagen, Cursoren usw. einrichten? Die einfache Antwort lautet: Sie müssen nicht. F3 vereinfacht alles, indem sie sich um all die harte Arbeit im Backend kümmert.
Diesmal erstellen wir eine HTML-Vorlage wie abc.htm
, das mindestens Folgendes hat:-
< repeat group =" {{ @result }} " value =" {{ @item }} " >
< span > {{ @item.brandName }} </ span >
</ repeat >
In den meisten Fällen sollte der SQL-Befehlssatz ausreichen, um ein Web-Ready-Ergebnis zu generieren, damit Sie die Ergebnisvariable der result
in Ihrer Vorlage direkt verwenden können. Wie dem auch sei, fettfrei hält Sie nicht davon ab, in seine SQL-Handler-Interna zu gelangen. Tatsächlich stellt DBSQL
Klasse von F3 direkt von der PDO
Klasse von PHP ab, sodass Sie weiterhin Zugriff auf die zugrunde liegenden PDO-Komponenten und -Pläler haben, die an jedem Prozess beteiligt sind, wenn Sie eine Feinkornsteuerung benötigen.
Hier ist ein weiteres Beispiel. Anstelle einer einzelnen Anweisung, die als Argument für den Befehl $db->exec()
angegeben ist, können Sie auch ein Array von SQL-Anweisungen übergeben:-
$ db -> exec (
[
' DELETE FROM diet WHERE food="cola" ' ,
' INSERT INTO diet (food) VALUES ("carrot") ' ,
' SELECT * FROM diet '
]
);
F3 ist klug genug, um zu wissen, dass dies eine SQL -Batch -Transaktion anzeigt, wenn Sie eine Reihe von SQL -Anweisungen übergeben. Sie müssen sich keine Sorgen um SQL -Rollbacks und Commits machen, da das Framework automatisch zum Ausgangszustand der Datenbank zurückgeht, wenn während der Transaktion Fehler auftritt. Wenn er erfolgreich ist, verpflichtet F3 alle Änderungen an der Datenbank.
Sie können auch eine Transaktion programmgesteuert starten und beenden:-
$ db -> begin ();
$ db -> exec ( ' DELETE FROM diet WHERE food="cola" ' );
$ db -> exec ( ' INSERT INTO diet (food) VALUES ("carrot") ' );
$ db -> exec ( ' SELECT * FROM diet ' );
$ db -> commit ();
Ein Rollback tritt auf, wenn eine der Anweisungen auf einen Fehler stoßen.
Um eine Liste aller ausgegebenen Datenbankanweisungen zu erhalten:-
echo $ db -> log ();
Das Übergeben von Stringargumenten an SQL -Anweisungen ist voller Gefahr. Betrachten Sie dies:-
$ db -> exec (
' SELECT * FROM users ' .
' WHERE username=" ' . $ f3 -> get ( ' POST.userID ' . ' " ' )
);
Wenn die POST
Variable userID
keinen Datenansatzprozess durchläuft, kann ein böswilliger Benutzer die folgende Zeichenfolge übergeben und Ihre Datenbank irreversibel beschädigen:-
admin " ; DELETE FROM users; SELECT " 1
Zum Glück helfen Sie parametrisierte Abfragen, diese Risiken zu mildern:-
$ db -> exec (
' SELECT * FROM users WHERE userID=? ' ,
$ f3 -> get ( ' POST.userID ' )
);
Wenn F3 feststellt, dass der Wert des Abfrageparameters/Token eine Zeichenfolge ist, entgeht die zugrunde liegende Datenzugriffsschicht der Zeichenfolge und fügt nach Bedarf Anführungszeichen hinzu.
Unser Beispiel im vorherigen Abschnitt ist von der SQL-Injektion viel sicherer, wenn sie so geschrieben wurde:-
$ db -> exec (
[
' DELETE FROM diet WHERE food=:name ' ,
' INSERT INTO diet (food) VALUES (?) ' ,
' SELECT * FROM diet '
],
[
array ( ' :name ' => ' cola ' ),
array ( 1 => ' carrot ' ),
NULL
]
);
F3 ist mit benutzerfreundlichen Objekt-Relationskonstern (ORMs) gefüllt, die zwischen Ihrer Anwendung und Ihren Daten sitzen-damit Sie für Sie Programme, die gemeinsame Datenvorgänge verarbeiten, viel einfacher und schneller machen-wie Erstellen, Abrufen, Aktualisieren, und CRUD -Informationen (CRUD) aus SQL- und NoSQL -Datenbanken. Data -Mapper erledigen die meisten Arbeiten, indem sie PHP -Objektinteraktionen auf die entsprechenden Backend -Abfragen abbilden.
Angenommen, Sie haben eine vorhandene MySQL -Datenbank mit einer Tabelle der Benutzer Ihrer Anwendung. (SQLite, PostgreSQL, SQL Server, Sybase gilt genauso gut.) Es wäre mit dem folgenden SQL-Befehl erstellt worden:-
CREATE TABLE users (
userID VARCHAR ( 30 ),
password VARCHAR ( 30 ),
visits INT ,
PRIMARY KEY (userID)
);
Hinweis: MongoDB ist eine NoSQL-Datenbankmotor und inhärent Schema. F3 verfügt über eine eigene schnelle und leichte NOSQL-Implementierung namens JIG, die PHP-serialisierte oder JSON-kodierte Flatendateien verwendet. Diese Abstraktionsschichten erfordern keine starre Datenstrukturen. Felder können von einem Rekord zum anderen variieren. Sie können auch im laufenden Flug definiert oder fallen gelassen werden.
Jetzt zurück zu SQL. Zunächst stellen wir Kommunikation mit unserer Datenbank fest.
$ db = new DB SQL (
' mysql:host=localhost;port=3306;dbname=mysqldb ' ,
' admin ' ,
' wh4t3v3r '
);
Um einen Datensatz aus unserer Tabelle abzurufen:-
$ user = new DB SQL Mapper ( $ db , ' users ' );
$ user -> load ([ ' userID=? ' , ' tarzan ' ]);
Die erste Zeile instanziiert ein Data Mapper -Objekt, das mit der users
in unserer Datenbank interagiert. Hinter der Szene ruft F3 die Struktur der users
ab und bestimmt, welche Feld (n) als Primärschlüssel (n) definiert sind. Zu diesem Zeitpunkt enthält das Mapper -Objekt noch keine Daten (trockener Zustand), sodass $user
nichts weiter als ein strukturiertes Objekt ist - aber es enthält die Methoden, die es benötigt, um die grundlegenden CRUD -Operationen und einige Extras auszuführen. Um einen Datensatz aus unserer Benutzertabelle mit einem userID
-Feld mit dem String -Wert tarzan
abzurufen, verwenden wir die load() method
. Dieser Vorgang wird als "automatisch-Hydrating" als Data Mapper-Objekt bezeichnet.
Einfach, war es nicht? F3 versteht, dass eine SQL -Tabelle bereits eine strukturelle Definition aufweist, die in der Datenbankmotor selbst vorhanden ist. Im Gegensatz zu anderen Frameworks erfordert F3 keine zusätzlichen Klassenerklärungen (es sei denn, Sie möchten die Daten Mapper auf komplexe Objekte anpassen), kein redundantes PHP-Array/Object-Eigenschaft-zu-Feld Regeneration Wenn sich die Datenbankstruktur ändert), keine dummen XML/YAML -Dateien zum Konfigurieren Ihrer Modelle, keine überflüssigen Befehle, nur um einen einzelnen Datensatz abzurufen. Bei F3 erfordert eine einfache Größe eines varchar
-Feldes in MySQL keine Änderung in Ihrem Anwendungscode. In Übereinstimmung mit MVC und "Trennung von Bedenken" verfügt der Datenbankadministrator über die Daten (und die Strukturen) wie ein Vorlagendesigner über HTML/XML -Vorlagen.
Wenn Sie es vorziehen, mit NoSQL -Datenbanken zu arbeiten, sind die Ähnlichkeiten in der Abfragesyntax oberflächlich. Im Falle des MongoDB-Daten Mapper wäre der äquivalente Code:-
$ db = new DB Mongo ( ' mongodb://localhost:27017 ' , ' testdb ' );
$ user = new DB Mongo Mapper ( $ db , ' users ' );
$ user -> load ([ ' userID ' => ' tarzan ' ]);
Mit JIG ähnelt die Syntax der Template Engine von F3:-
$ db = new DB Jig ( ' db/data/ ' , DB Jig:: FORMAT_JSON );
$ user = new DB Jig Mapper ( $ db , ' users ' );
$ user -> load ([ ' @userID=? ' , ' tarzan ' ]);
Das Framework ordnet die visits
in unserer Tabelle automatisch auf eine Data Mapper -Eigenschaft während der Objekt -Instanziierung ab, dh $user=new DBSQLMapper($db,'users');
. Sobald das Objekt erstellt wurde, würde $user->password
und $user->userID
auf das password
und userID
Felder in unserer Tabelle zugeordnet.
Sie können ein kartiertes Feld nicht hinzufügen oder löschen oder die Struktur einer Tabelle mit dem ORM ändern. Sie müssen dies in MySQL oder in welcher Datenbank -Engine, die Sie verwenden, tun. Nachdem Sie die Änderungen in Ihrer Datenbank-Engine vorgenommen haben, synchronisiert FAT-Free die neue Tabellenstruktur automatisch mit Ihrem Data Mapper-Objekt, wenn Sie Ihre Anwendung ausführen.
F3 leitet die Data Mapper -Struktur direkt aus dem Datenbankschema ab. Keine Vermutung. Es versteht die Unterschiede zwischen MySQL-, SQLite-, MSSQL-, Sybase- und PostgreSQL -Datenbankmotoren.
SQL-Identifikatoren sollten nicht reservierte Wörter verwenden und auf alphanumerische Zeichen AZ
, 0-9
und das Unterstrich-Symbol ( _
) beschränkt sein. Spaltennamen, die Räume (oder Sonderzeichen) enthalten und von Zitaten in der Datendefinition umgeben sind, sind nicht mit dem ORM kompatibel. Sie können nicht als PHP -Objekteigenschaften ordnungsgemäß dargestellt werden.
Angenommen, wir möchten die Anzahl der Besuche des Benutzers inkrementieren und den entsprechenden Datensatz in unserer Benutzertabelle aktualisieren. Wir können den folgenden Code hinzufügen:-
$ user -> visits ++;
$ user -> save ();
Wenn wir einen Datensatz einfügen wollten, folgen wir diesem Prozess:-
$ user = new DB SQL Mapper ( $ db , ' users ' );
// or $ user = new DB Mongo Mapper ($ db , 'users' );
// or $ user = new DB Jig Mapper ($ db , 'users' );
$ user -> userID = ' jane ' ;
$ user -> password = password_hash ( ' secret ' , PASSWORD_BCRYPT , [ ' cost ' => 12 ]);
$ user -> visits = 0 ;
$ user -> save ();
Wir verwenden immer noch die gleiche save()
-Methode. Aber woher weiß F3, wann ein Datensatz eingefügt oder aktualisiert werden soll? Zum Zeitpunkt des Zeitpunkts wird ein Data Mapper -Objekt automatisch durch ein Datensatzabruf automatisch hydriert, das Framework verfolgt die primären Schlüssel (oder _id
, im Fall von MongoDB und Jig) - so dass es weiß, welcher Datensatz aktualisiert oder gelöscht werden sollte - sogar - sogar gelöscht werden sollte - sogar - sogar gelöscht werden sollte Wenn die Werte der Primärschlüssel geändert werden. Ein programmatisch hydratisierter Daten -Mapper - dessen Werte nicht aus der Datenbank abgerufen wurden, sondern von der Anwendung besiedelt wurden - hat keinen Speicher an frühere Werte in den Primärschlüssel. Gleiches gilt für MongoDB und Jig, verwendet jedoch _id
als Referenz. Wenn wir also das obige $user
-Objekt instanziiert und seine Eigenschaften mit Werten aus unserem Programm besiedelt haben - ohne einen Datensatz aus der Benutzertabelle abzurufen, weiß F3, dass es diesen Datensatz einfügen sollte.
Ein Mapper -Objekt ist nach einem save()
nicht leer. Wenn Sie Ihrer Datenbank einen neuen Datensatz hinzufügen möchten, müssen Sie zuerst den Mapper dehydrieren:-
$ user -> reset ();
$ user -> userID = ' cheetah ' ;
$ user -> password = password_hash ( ' unknown ' , PASSWORD_BCRYPT , [ ' cost ' => 12 ]);
$ user -> save ();
Aufrufen von save()
Ein zweites Mal ohne Aufrufen von reset()
aktualisiert einfach den Datensatz, auf den der Mapper hingewiesen wird.
Obwohl das Problem der Primärschlüssel in allen Tabellen in Ihrer Datenbank argumentativ ist, hindert F3 Sie nicht daran, ein Data Mapper -Objekt zu erstellen, das mit einer Tabelle mit keinen Primärschlüssel kommuniziert. Der einzige Nachteil ist: Sie können einen zugeordneten Datensatz nicht löschen oder aktualisieren, da F3 absolut keine Möglichkeit gibt, zu bestimmen, auf welchen Datensatz Sie sich beziehen, und die Tatsache, dass Positionsreferenzen nicht zuverlässig sind. Zeilen -IDs sind über verschiedene SQL -Motoren nicht tragbar und werden möglicherweise nicht vom PHP -Datenbank -Treiber zurückgegeben.
Um einen zugeordneten Datensatz aus unserer Tabelle zu entfernen, rufen Sie die erase()
-Methode auf einem automatisch hydrierten Daten Mapper auf. Zum Beispiel:-
$ user = new DB SQL Mapper ( $ db , ' users ' );
$ user -> load ([ ' userID=? AND password=? ' , ' cheetah ' , ' ch1mp ' ]);
$ user -> erase ();
Die Abfragesyntax von Jig wäre geringfügig ähnlich:-
$ user = new DB Jig Mapper ( $ db , ' users ' );
$ user -> load ([ ' @userID=? AND @password=? ' , ' cheetah ' , ' chimp ' ]);
$ user -> erase ();
Und das MongoDB-Äquivalent wäre:-
$ user = new DB Mongo Mapper ( $ db , ' users ' );
$ user -> load ([ ' userID ' => ' cheetah ' , ' password ' => ' chimp ' ]);
$ user -> erase ();
Um herauszufinden, ob unser Data Mapper hydratisiert war oder nicht:-
if ( $ user -> dry ())
echo ' No record matching criteria ' ;
Wir haben die Crud -Handler bedeckt. Es gibt einige zusätzliche Methoden, die Sie möglicherweise nützlich finden:-
$ f3 -> set ( ' user ' , new DB SQL Mapper ( $ db , ' users ' ));
$ f3 -> get ( ' user ' )-> copyFrom ( ' POST ' );
$ f3 -> get ( ' user ' )-> save ();
Beachten Sie, dass wir auch fettfreie Variablen als Container für Mapper-Objekte verwenden können. Die Methode copyFrom()
feuchtigkeits das Mapper -Objekt mit Elementen aus einer Framework -Array -Variablen, deren Array -Tasten Namen mit den MakPer -Objekteigenschaften identisch haben müssen, die wiederum den Feldnamen des Datensatzes entsprechen. Wenn also ein Webformular eingereicht wird (unter der Annahme des HTML -Namensattributs auf userID
) wird der Inhalt dieses Eingangsfeldes auf $_POST['userID']
übertragen, von F3 in seiner POST.userID
-Variablen dupliziert und auf gespeichert an F3 dupliziert und auf gespeichert wird an F3 Das zugeordnete Feld $user->userID
in der Datenbank. Der Prozess wird sehr einfach, wenn sie alle identisch benannte Elemente haben. Konsistenz in Arrayschlüssel, dh Vorlagen -Token -Namen, Framework -Variablennamen und Feldnamen ist der Schlüssel :)
Auf der anderen Seite, wenn wir einen Datensatz abrufen und die Feldwerte für eine spätere Verwendung in eine Framework-Variable kopieren wollten, z. B. das Rendern der Vorlage:-
$ f3 -> set ( ' user ' , new DB SQL Mapper ( $ db , ' users ' ));
$ f3 -> get ( ' user ' )-> load ([ ' userID=? ' , ' jane ' ]);
$ f3 -> get ( ' user ' )-> copyTo ( ' POST ' );
Wir können dann {{ @post.userid}} dem Wert desselben Eingabefeldes zuweisen. Zusammenfassend sieht das HTML-Eingangsfeld wie folgt aus:-
< input type =" text " name =" userID " value =" {{ @POST.userID }} " />
Die save()
, update()
, copyFrom()
Data Mapper -Methoden und die parametrisierten Varianten von load()
und erase()
sind vor der SQL -Injektion sicher.
Standardmäßig ruft die load()
-Methode eines Data Mapper nur den ersten Datensatz ab, der mit den angegebenen Kriterien übereinstimmt. Wenn Sie mehr als einen haben, der dieselbe Bedingung wie der erste geladene Datensatz erfüllt, können Sie die skip()
-Methode für die Navigation verwenden:-
$ user = new DB SQL Mapper ( $ db , ' users ' );
$ user -> load ( ' visits>3 ' );
// Rewritten as a parameterized query
$ user -> load ([ ' visits>? ' , 3 ]);
// For MongoDB users : -
// $ user = new DB Mongo Mapper ($ db , 'users' );
// $ user - > load ([ 'visits' = > [ '$gt' = > 3 ]]);
// If you prefer Jig : -
// $ user = new DB Jig Mapper ($ db , 'users' );
// $ user - > load ( '@visits>?' , 3 );
// Display the userID of the first record that matches the criteria
echo $ user -> userID ;
// Go to the next record that matches the same criteria
$ user -> skip (); // Same as $ user - > skip ( 1 );
// Back to the first record
$ user -> skip (- 1 );
// Move three records forward
$ user -> skip ( 3 );
Sie können $user->next()
als Ersatz für $user->skip()
und $user->prev()
verwenden, wenn Sie der Meinung sind, dass $user->skip(-1)
mehr Bedeutung gibt.
Verwenden Sie die dry()
-Methode, um zu überprüfen, ob Sie über die Grenzen des Ergebnissatzes hinaus manövriert haben. dry()
kehrt true zurück, wenn Sie versuchen, auf dem ersten Datensatz skip(-1)
. Es wird auch wieder auftreten, wenn Sie skip(1)
, der den Abrufkriterien entspricht.
Die load()
-Methode akzeptiert ein zweites Argument: eine Reihe von Optionen mit Schlüsselwertpaaren wie:-
$ user -> load (
[ ' visits>? ' , 3 ],
[
' order ' => ' userID DESC '
'offset'=> 5 ,
' limit ' => 3
]
);
Wenn Sie MySQL verwenden, übersetzt die Abfrage:-
SELECT * FROM users
WHERE visits > 3
ORDER BY userID DESC
LIMIT 3 OFFSET 5 ;
Dies ist eine Möglichkeit, Daten in kleinen Stücken darzustellen. Hier ist eine andere Möglichkeit, Ergebnisse zu pagieren:-
$ page = $ user -> paginate ( 2 , 5 ,[ ' visits>? ' , 3 ]);
Im obigen Szenario ruft F3 Datensätze ab, die den Kriterien 'visits>3'
übereinstimmen. Anschließend wird die Ergebnisse auf 5 Datensätze (pro Seite) beginnend bei Page Offset 2 (0 basiert) beschränkt. Das Framework gibt ein Array zurück, das aus den folgenden Elementen besteht:-
[subset] array of mapper objects that match the criteria
[count] number of subsets available
[pos] actual subset position
Die zurückgegebene tatsächliche Teilmengeposition ist null, wenn das erste Argument von paginate()
eine negative Zahl ist oder die Anzahl der gefundenen Untergruppen überschreitet.
Es gibt Fälle, in denen Sie einen berechneten Wert eines Feldes oder einen kreuzbezogenen Wert aus einer anderen Tabelle abrufen müssen. Geben Sie virtuelle Felder ein. Mit dem SQL-Mini-ARORM können Sie an Daten arbeiten, die aus vorhandenen Feldern abgeleitet wurden.
Angenommen, wir haben die folgende Tabelle definiert als:-
CREATE TABLE products
productID VARCHAR ( 30 ),
description VARCHAR ( 255 ),
supplierID VARCHAR ( 30 ),
unitprice DECIMAL ( 10 , 2 ),
quantity INT ,
PRIMARY KEY (productID)
);
Es gibt kein totalprice
Feld, sodass wir das Framework von der Datenbank-Engine anfordern sollen, das arithmetische Produkt der beiden Felder:-
$ item = new DB SQL Mapper ( $ db , ' products ' );
$ item -> totalprice = ' unitprice*quantity ' ;
$ item -> load ([ ' productID=:pid ' , ' :pid ' => ' apple ' ]);
echo $ item -> totalprice ;
Das obige Code -Snippet definiert ein virtuelles Feld namens totalprice
, das durch Multiplizieren unitprice
mit der quantity
berechnet wird. Der SQL Mapper speichert diese Regel/Formel. Wenn die Zeit zum Abrufen des Datensatzes aus der Datenbank abgerufen wird, können wir das virtuelle Feld wie ein reguläres Feld verwenden.
Sie können komplexere virtuelle Felder haben:-
$ item -> mostNumber = ' MAX(quantity) ' ;
$ item -> load ();
echo $ item -> mostNumber ;
Dieses Mal ruft das Framework das Produkt mit der höchsten Menge ab (beachten Sie, dass die Methode load()
keine Kriterien definiert, sodass alle Datensätze in der Tabelle verarbeitet werden). Natürlich gibt Ihnen das mostNumber
virtuelle Feld weiterhin die richtige Zahl, wenn Sie den Ausdruck auf eine bestimmte Gruppe von Datensätzen beschränken möchten, die mit einem festgelegten Kriterien übereinstimmen.
Sie können auch einen Wert aus einer anderen Tabelle ableiten:-
$ item -> supplierName =
' SELECT name FROM suppliers ' .
' WHERE products.supplierID=suppliers.supplierID ' ;
$ item -> load ();
echo $ item -> supplierName ;
Jedes Mal, wenn Sie eine Aufzeichnung aus der Produkttabelle laden, referenziert die ORM die supplerID
in der products
mit der supplierID
in der suppliers
-Tabelle.
Um ein virtuelles Feld zu zerstören, verwenden Sie unset($item->totalPrice);
. Der Ausdruck der isset($item->totalPrice)
gibt true zurück, wenn das virtuelle totalPrice
Feld definiert wurde oder wenn auch nicht falsch.
Denken Sie daran, dass ein virtuelles Feld vor dem Abrufen von Daten definiert werden muss. Das ORM führt weder die tatsächliche Berechnung noch die Ableitung von Ergebnissen aus einer anderen Tabelle durch. Es ist die Datenbankmotor, die die ganze harte Arbeit leistet.
Wenn Sie keine Rekordnavigation benötigen, können Sie eine ganze Reihe von Aufzeichnungen in einer Aufnahme abrufen:-
$ frequentUsers = $ user -> find ([ ' visits>? ' , 3 ],[ ' order ' => ' userID ' ]);
Die Query-Syntax von Jig Mapper hat eine leichte Ähnlichkeit:-
$ frequentUsers = $ user -> find ([ ' @visits>? ' , 3 ],[ ' order ' => ' userID ' ]);
Der äquivalente Code unter Verwendung des MongoDB Mapper:-
$ frequentUsers = $ user -> find ([ ' visits ' =>[ ' $gt ' => 3 ]],[ ' userID ' => 1 ]);
Die Methode find()
durchsucht die users
nach Datensätzen, die den Kriterien entsprechen, sortiert das Ergebnis nach userID
und gibt das Ergebnis als Array von Mapper -Objekten zurück. find('visits>3')
unterscheidet sich von load('visits>3')
. Letzteres bezieht sich auf das aktuelle $user
-Objekt. find()
hat keinen Einfluss auf skip()
.
WICHTIG: Deklarieren Sie einen leeren Zustand, eine Null oder eine String mit Null-Länge als erstes Argument von find()
oder load()
ruft alle Datensätze ab. Stellen Sie sicher, dass Sie wissen, was Sie tun - Sie könnten PHP von MEOTOR_LIMIT von PHP in großen Tabellen oder Sammlungen überschreiten.
Die find()
-Methode hat die folgende Syntax:-
find (
$ criteria ,
[
' group ' => ' foo ' ,
' order ' => ' foo,bar ' ,
' limit ' => 5 ,
' offset ' => 0
]
);
find () gibt eine Reihe von Objekten zurück. Jedes Objekt ist ein Mapper zu einem Datensatz, der den angegebenen Kriterien entspricht .:-
$ place = new DB SQL Mapper ( $ db , ' places ' );
$ list = $ place -> find ( ' state="New York" ' );
foreach ( $ list as $ obj )
echo $ obj -> city . ' , ' . $ obj -> country ;
Wenn Sie ein Mapper-Objekt in ein assoziatives Array konvertieren müssen, verwenden Sie die Methode cast()
:-
$ array = $ place -> cast ();
echo $ array [ ' city ' ]. ' , ' . $ array [ ' country ' ];
Um die Anzahl der Datensätze in einer Tabelle abzurufen, die mit einer bestimmten Bedingung übereinstimmt, verwenden Sie die Methode count()
.
if (! $ user -> count ([ ' visits>? ' , 10 ]))
echo ' We need a better ad campaign! ' ;
Es gibt auch eine select()
-Methode, die ähnlich ist wie bei find()
bietet jedoch eine feinkörnigere Kontrolle über die zurückgegebenen Felder. Es hat eine SQL-ähnliche Syntax:-
select (
' foo, bar, MIN(baz) AS lowest ' ,
' foo > ? ' ,
[
' group ' => ' foo, bar ' ,
' order ' => ' baz ASC ' ,
' limit ' => 5 ,
' offset ' => 3
]
);
Ähnlich wie bei der find()
-Methode ändert select()
den Inhalt des Mapper -Objekts nicht. Es dient nur als Convenience -Methode für die Abfrage eines zugeordneten Tisches. Der Rückgabewert beider Methoden ist ein Array von Mapper -Objekten. Die Verwendung von dry()
um zu bestimmen, ob eine Datensätze durch eine dieser Methoden gefunden wurden, ist unangemessen. Wenn keine Datensätze mit den Kriterien von find()
oder select()
übereinstimmen, ist der Rückgabewert ein leeres Array.
Wenn Sie jemals herausfinden möchten, welche SQL-Anweisungen direkt von Ihrer Anwendung (oder indirekt durch Mapper-Objekte) ausgeben, verursachen Sie dies mit einem einfachen:-
echo $ db -> log ();
F3 verfolgt alle Befehle, die dem zugrunde liegenden SQL -Datenbank -Treiber ausgegeben wurden, sowie die Zeit, die für jede Anweisung erforderlich ist - genau die richtigen Informationen, die Sie für die Anwendungsleistung optimieren müssen.
In den meisten Fällen können Sie nach dem Komfort leben, den die Daten Mapper -Methoden bisher diskutiert haben. Wenn Sie das Framework benötigen, um eine schwere Arbeit zu erledigen, können Sie den SQL Mapper erweitern, indem Sie Ihre eigenen Klassen mit benutzerdefinierten Methoden deklarieren.
class Vendor extends DB SQL Mapper {
// Instantiate mapper
function __construct ( DB SQL $ db ) {
// This is where the mapper and DB structure synchronization occurs
parent :: __construct ( $ db , ' vendors ' );
}
// Specialized query
function listByCity () {
return $ this -> select (
' vendorID,name,city ' ,[ ' order ' => ' city DESC ' ]);
/ *
We could have done the the same thing with plain vanilla SQL : -
return $ this - > db - > exec (
'SELECT vendorID,name,city FROM vendors ' .
'ORDER BY city DESC;'
);
* /
}
}
$ vendor = new Vendor ;
$ vendor -> listByCity ();
Die Erweiterung der Datenmapper auf diese Weise ist eine einfache Möglichkeit, die DB-bezogenen Modelle Ihrer Anwendung zu konstruieren.
Wenn Sie mit SQL praktisch sind, würden Sie wahrscheinlich sagen: Alles im Orm kann mit SQL-Abfragen der alten Schule behandelt werden. In der Tat. Wir können auf die zusätzlichen Ereignishörer verzichten, indem wir Datenbankauslöser und gespeicherte Verfahren verwenden. Wir können relationale Anfragen mit zusammengefügten Tischen durchführen. Das ORM ist nur unnötiger Overhead. Der Punkt ist jedoch: Datenzuschussgebiete geben Ihnen die zusätzliche Funktionalität der Verwendung von Objekten zur Darstellung von Datenbankentitäten. Als Entwickler können Sie Code schneller schreiben und produktiver sein. Das resultierende Programm ist sauberer, wenn nicht sogar kürzer. Sie müssen jedoch die Vorteile gegen den Kompromiss in der Geschwindigkeit abwägen - insbesondere beim Umgang mit großen und komplexen Datenspeichern. Denken Sie daran, alle Ormen - egal wie dünn sie sind - werden immer nur eine andere Abstraktionsschicht sein. Sie müssen die Arbeit noch an die zugrunde liegenden SQL -Motoren weitergeben.
Für das Design bieten die ORMs von F3 keine Methoden, um Objekte direkt miteinander zu verbinden, dh SQL schließt sich an - da dies eine Dose Würmer eröffnet. Es macht Ihre Anwendung komplexer, als sie sein sollte, und es besteht die Tendenz von Objekten, die eifrigen oder faulen Fetching -Techniken aufgrund von Objektvererbung und Polymorphismus (Impedanzfehlanpassung) mit den Datenbankeinheiten, denen sie zugeordnet sind . Es gibt indirekte Möglichkeiten, dies im SQL Mapper unter Verwendung virtueller Felder zu tun - aber Sie müssen dies programmgesteuert und auf eigenes Risiko tun.
Wenn Sie versucht sind, "reine" OOP -Konzepte in Ihrer Anwendung anzuwenden, um alle Ihre Daten darzustellen (weil "alles ein Objekt ist"), denken Sie daran, dass Daten fast immer länger leben als die Anwendung. Ihr Programm ist möglicherweise bereits veraltet, lange bevor die Daten ihren Wert verloren haben. Fügen Sie in Ihrem Programm keine weitere Komplexitätsebene hinzu, indem Sie miteinander verflochtenen Objekten und Klassen verwenden, die zu stark vom Schema und der physischen Struktur der Daten abweichen.
Bevor Sie mehrere Objekte in Ihrer Anwendung zusammenweben, um die zugrunde liegenden Tabellen in Ihrer Datenbank zu manipulieren, denken Sie darüber nach: Erstellen von Ansichten, um Beziehungen und Auslöser zur Definition des Objektverhaltens in der Datenbank -Engine zu erstellen, sind effizienter. Relationale Datenbankmotoren sind so konzipiert, dass sie Ansichten, Verbindungstabellen und Trigger verarbeiten. Sie sind keine dummen Datenspeicher. Tabellen, die in einer Ansicht verbunden sind, werden als einzelne Tabelle angezeigt, und fettfrei kann eine Ansicht genauso gut wie eine reguläre Tabelle. Die Replikationsverbindungen als relationale Objekte in PHP sind im Vergleich zum Maschinencode der Datenbank -Engine, der relationalen Algebra und der Optimierungslogik langsamer. Außerdem ist es ein sicheres Zeichen dafür, dass das Datenbankdesign wiederholt in unserer Anwendung geprüft werden muss, und Ansichten betrachten einen integralen Bestandteil des Datenabrufs. Wenn eine Tabelle häufig Daten aus einer anderen Tabelle überschreitet, sollten Sie Ihre Strukturen normalisieren oder stattdessen eine Ansicht erstellen. Erstellen Sie dann ein Mapper-Objekt, um diese Ansicht automatisch zu machen. Es ist schneller und erfordert weniger Anstrengung.
Betrachten Sie diese SQL-Ansicht, die in Ihrer Datenbank-Engine erstellt wurde:-
CREATE VIEW combined AS
SELECT
projects . project_id AS project,
users . name AS name
FROM projects
LEFT OUTER JOIN users ON
projects . project_id = users . project_id AND
projects . user_id = users . user_id ;
Ihr Anwendungscode wird einfach, da er nicht zwei Mapper-Objekte verwalten muss (eine für die Projekttabelle und eine für Benutzer), nur um Daten aus zwei zusammengefügten Tabellen abzurufen:-
$ combined = new DB SQL Mapper ( $ db , ' combined ' );
$ combined -> load ([ ' project=? ' , 123 ]);
echo $ combined -> name ;
Tipp: Verwenden Sie die Werkzeuge, für die sie ausgelegt sind. Fettfrei hat bereits einen benutzerfreundlichen SQL-Helfer. Verwenden Sie es, wenn Sie einen größeren Hammer benötigen :) Versuchen Sie, ein Gleichgewicht zwischen Bequemlichkeit und Leistung zu suchen. SQL wird immer Ihr Fallback sein, wenn Sie an komplexen und älteren Datenstrukturen arbeiten.
Plug-ins are nothing more than autoloaded classes that use framework built-ins to extend F3's features and functionality. If you'd like to contribute, leave a note at the Fat-Free Discussion Area hosted by Google Groups or tell us about it in the FreeNode #fatfree
IRC channel. Someone else might be involved in a similar project. The framework community will appreciate it a lot if we unify our efforts.
There might be instances when you want to make your forms more secure against spam bots and malicious automated scripts. F3 provides a captcha()
method to generate images with random text that are designed to be recognizable only by humans.
$ img = new Image ();
$ img -> captcha ( ' fonts/CoolFont.ttf ' , 16 , 5 , ' SESSION.captcha_code ' );
$ img -> render ();
This example generates an random image based on your desired TrueType font. The fonts/
folder is a subfolder within application's UI
path. The second parameter indicates the font size, and the third argument defines the number of hexadecimal characters to generate.
The last argument represents an F3 variable name. This is where F3 will store the string equivalent of the CAPTCHA image. To make the string reload-safe, we specified a session variable:- SESSION.captcha_code
which maps to $_SESSION['captcha_code']
, which you can use later to verify whether the input element in the form submitted matches this string.
We've covered almost every feature available in the framework to run a stand-alone Web server. For most applications, these features will serve you quite well. But what do you do if your application needs data from another Web server on the network? F3 has the Web plugin to help you in this situation:-
$ web = new Web ;
$ request = $ web -> request ( ' http://www.google.com/ ' );
// another way to do it : -
$ request =Web:: instance ()-> request ( ' http://www.google.com/ ' );
This simple example sends an HTTP request to the page located at www.google.com and stores it in the $request
PHP variable. The request()
method returns an array containing the HTTP response such that $request['headers']
and $request['body']
represent the response headers and body, respectively. We could have saved the contents using the F3::set command, or echo'ed the output directly to our browser. Retrieving another HTML page on the net may not have any practical purpose. But it can be particularly useful in ReSTful applications, like querying a CouchDB server.
$ host = ' localhost:5984 ' ;
$ web -> request ( $ host . ' /_all_dbs ' ),
$ web -> request ( $ host . ' /testdb/ ' ,[ ' method ' => ' PUT ' ]);
You may have noticed that you can pass an array of additional options to the request()
method:-
$ web -> request (
' https://www.example.com:443? ' .
http_build_query (
[
' key1 ' => ' value1 ' ,
' key2 ' => ' value2 '
]
),
[
' headers ' =>[
' Accept: text/html,application/xhtml+xml,application/xml ' ,
' Accept-Language: en-us '
],
' follow_location ' => FALSE ,
' max_redirects ' => 30 ,
' ignore_errors ' => TRUE
]
);
If the framework variable CACHE
is enabled, and if the remote server instructs your application to cache the response to the HTTP request, F3 will comply with the request and retrieve the cached response each time the framework receives a similar request from your application, thus behaving like a browser.
Fat-Free will use whatever means are available on your Web server for the request()
method to run: PHP stream wrappers ( allow_url_fopen
), cURL module, or low-level sockets.
F3 has a utility for sending files to an HTTP client, ie fulfilling download requests. You can use it to hide the real path to your download files. This adds some layer of security because users won't be able to download files if they don't know the file names and their locations. Here's how it's done:-
$ f3 -> route ( ' GET /downloads/@filename ' ,
function ( $ f3 , $ args ) {
// send () method returns FALSE if file doesn ' t exist
if (!Web:: instance ()-> send ( ' /real/path/ ' . $ args [ ' filename ' ]))
// Generate an HTTP 404
$ f3 -> error ( 404 );
}
);
The request()
method can also be used in complex SOAP or XML-RPC applications, if you find the need for another Web server to process data on your computer's behalf - thus harnessing the power of distributing computing. W3Schools.com has an excellent tutorial on SOAP. On the other hand, TutorialsPoint.com gives a nice overview of XML-RPC.
Caching static Web pages - so the code in some route handlers can be skipped and templates don't have to be reprocessed - is one way of reducing your Web server's work load so it can focus on other tasks. You can activate the framework's cache engine by providing a third argument to the $f3->route()
method. Just specify the number of seconds before a cached Web page expires:-
$ f3 -> route ( ' GET /my_page ' , ' App->method ' , 60 );
So funktioniert es. In this example, when F3 detects that the URL /my_page
is accessed for the first time, it executes the route handler represented by the second argument and saves all browser output to the framework's built-in cache (server-side). A similar instruction is automatically sent to the user's Web browser (client-side), so that instead of sending an identical request to the server within the 60-second period, the browser can just retrieve the page locally. The framework uses the cache for an entirely different purpose - serving framework-cached data to other users asking for the same Web page within the 60-second time frame. It skips execution of the route handler and serves the previously-saved page directly from disk. When someone tries to access the same URL after the 60-second timer has lapsed, F3 will refresh the cache with a new copy.
Web pages with static data are the most likely candidates for caching. Fat-Free will not cache a Web page at a specified URL if the third argument in the $f3->route()
method is zero or unspecified. F3 conforms to the HTTP specifications: only GET and HEAD requests can be cached.
Here's an important point to consider when designing your application. Don't cache Web pages unless you understand the possible unwanted side-effects of the cache at the client-side. Make sure that you activate caching on Web pages that have nothing to do with the user's session state.
For example, you designed your site in such a way that all your Web pages have the menu options: "Home"
, "About Us"
, and "Login"
, displayed when a user is not logged into your application. You also want the menu options to change to: "Home"
, "About Us"
, and "Logout"
, once the user has logged in. If you instructed Fat-Free to cache the contents of "About Us"
page (which includes the menu options), it does so and also sends the same instruction to the HTTP client. Regardless of the user's session state, ie logged in or logged out, the user's browser will take a snapshot of the page at the session state it was in. Future requests by the user for the "About Us"
page before the cache timeout expires will display the same menu options available at that time the page was initially saved. Now, a user may have already logged in, but the menu options are still the same as if no such event occurred. That's not the kind of behavior we want from our application.
Some pointers:-
GET
routes only. It will not cache submitted forms!Don't activate the cache on Web pages that at first glance look static. In our example, the "About Us" content may be static, but the menu isn't."About Us"
page, make sure it's available only when a user is not logged in.CACHE
global variable so it points to that drive. This will make your application run like a Formula 1 race car. Note: Don't set the timeout value to a very long period until you're ready to roll out your application, ie the release or production state. Changes you make to any of your PHP scripts may not have the expected effect on the displayed output if the page exists in the framework cache and the expiration period has not lapsed. If you do alter a program that generates a page affected by the cache timer and you want these changes to take effect immediately, you should clear the cache by erasing the files in the cache/ directory (or whatever path the CACHE
global variable points to) . F3 will automatically refresh the cache if necessary. At the client-side, there's little you can do but instruct the user to clear the browser's cache or wait for the cache period to expire.
PHP needs to be set up correctly for the F3 cache engine to work properly. Your operating system timezone should be synchronized with the date.timezone setting in the php.ini
file.
Similar to routes, Fat-Free also allows you to cache database queries. Speed gains can be quite significant, specially when used on complex SQL statements that involve look-up of static data or database content that rarely changes. Activating the database query cache so the framework doesn't have to re-execute the SQL statements every time is as simple as adding a 3rd argument to the F3::sql command - the cache timeout. Zum Beispiel:-
$ db -> exec ( ' SELECT * from sizes; ' , NULL , 86400 );
If we expect the result of this database query to always be Small
, Medium
, and Large
within a 24-hour period, we specify 86400
seconds as the 2nd argument so Fat-Free doesn't have to execute the query more than once a day . Instead, the framework will store the result in the cache, retrieve it from the cache every time a request comes in during the specified 24-hour time frame, and re-execute the query when the timer lapses.
The SQL data mapper also uses the cache engine to optimize synchronization of table structures with the objects that represent them. The default is 60
seconds. If you make any changes to a table's structure in your database engine, you'll have to wait for the cache timer to expire before seeing the effect in your application. You can change this behavior by specifying a third argument to the data mapper constructor. Set it to a high value if you don't expect to make any further changes to your table structure.
$ user = new DB SQL Mapper ( $ db , ' users ' , 86400 );
By default, Fat-Free's cache engine is disabled. You can enable it and allow it to auto-detect APC, WinCache or XCache. If it cannot find an appropriate backend, F3 will use the filesystem, ie the tmp/cache/
folder:-
$ f3 -> set ( ' CACHE ' , TRUE );
Disabling the cache is as simple as:-
$ f3 -> set ( ' CACHE ' , FALSE );
If you wish to override the auto-detection feature, you can do so - as in the case of a Memcached back-end which F3 also supports:-
$ f3 -> set ( ' CACHE ' , ' memcache=localhost:11211 ' );
You can also use the cache engine to store your own variables. These variables will persist between HTTP requests and remain in cache until the engine receives instructions to delete them. To save a value in the cache:-
$ f3 -> set ( ' var ' , ' I want this value saved ' , 90 );
$f3->set()
method's third argument instructs the framework to save the variable in the cache for a 90-second duration. If your application issues a $f3->get('var')
within this period, F3 will automatically retrieve the value from cache. In like manner, $f3->clear('var')
will purge the value from both cache and RAM. If you want to determine if a variable exists in cache, `$f3->exists('var')); returns one of two possible values: FALSE if the framework variable passed does not exist in cache, or an integer representing the time the variable was saved (Un*x time in seconds, with microsecond precision).
Fat-Free also has a Javascript and CSS compressor available in the Web plug-in. It can combine all your CSS files into one stylesheet (or Javascript files into a single script) so the number of components on a Web page are decreased. Reducing the number of HTTP requests to your Web server results in faster page loading. First you need to prepare your HTML template so it can take advantage of this feature. Something like:-
< link rel =" stylesheet " type =" text/css "
href =" /minify/css?files=typo.css,grid.css " />
Do the same with your Javascript files:-
< script type =" text/javascript " src =" /minify/js?&files=underscore.js " >
</ script >
Of course we need to set up a route so your application can handle the necessary call to the Fat-Free CSS/Javascript compressor:-
$ f3 -> route ( ' GET /minify/@type ' ,
function ( $ f3 , $ args ) {
$ f3 -> set ( ' UI ' , $ args [ ' type ' ]. ' / ' );
echo Web:: instance ()-> minify ( $ _GET [ ' files ' ]);
},
3600
);
And that's all there is to it! minify()
reads each file ( typo.css
and grid.css
in our CSS example, underscore.js
in our Javascript example), strips off all unnecessary whitespaces and comments, combines all of the related items as a single Web page component, and attaches a far-future expiry date so the user's Web browser can cache the data. It's important that the PARAMS.type
variable base points to the correct path. Otherwise, the URL rewriting mechanism inside the compressor won't find the CSS/Javascript files.
In our examples, the framework sends a far-future expiry date to the client's Web browser so any request for the same CSS or Javascript block will come from the user's hard drive. On the server side, F3 will check each request and see if the CSS or Javascript blocks have already been cached. The route we specified has a cache refresh period of 3600
seconds. Additionally, if the Web browser sends an If-Modified-Since
request header and the framework sees the cache hasn't changed, F3 just sends an HTTP 304 Not Modified
response so no content is actually delivered. Without the If-Modified-Since
header, Fat-Free renders the output from the cached file if available. Otherwise, the relevant code is executed.
Tip: If you're not modifying your Javascript/CSS files frequently (as it would be if you're using a Javascript library like jQuery, MooTools, Dojo, etc.), consider adding a cache timer to the route leading to your Javascript/CSS minify handler (3rd argument of F3::route()) so Fat-Free doesn't have compress and combine these files each time such a request is received.
Want to make your site run even faster? Fat-Free works best with either Alternative PHP Cache (APC), XCache, or WinCache. These PHP extensions boost performance of your application by optimizing your PHP scripts (including the framework code).
A fast application that processes all HTTP requests and responds to them at the shortest time possible is not always a good idea - specially if your bandwidth is limited or traffic on your Web site is particularly heavy. Serving pages ASAP also makes your application vulnerable to Denial-of-Service (DOS) attacks. F3 has a bandwidth throttling feature that allows you to control how fast your Web pages are served. You can specify how much time it should take to process a request:-
$ f3 -> route ( ' /throttledpage ' , ' MyApp->handler ' , 0 , 128 );
In this example, the framework will serve the Web page at a rate of 128KiBps.
Bandwidth throttling at the application level can be particularly useful for login pages. Slow responses to dictionary attacks is a good way of mitigating this kind of security risk.
Robust applications are the result of comprehensive testing. Verifying that each part of your program conforms to the specifications and lives up to the expectations of the end-user means finding bugs and fixing them as early as possible in the application development cycle.
If you know little or nothing about unit testing methodologies, you're probably embedding pieces of code directly in your existing program to help you with debugging. That of course means you have to remove them once the program is running. Leftover code fragments, poor design and faulty implementation can creep up as bugs when you roll out your application later.
F3 makes it easy for you to debug programs - without getting in the way of your regular thought processes. The framework does not require you to build complex OOP classes, heavy test structures, and obtrusive procedures.
A unit (or test fixture) can be a function/method or a class. Let's have a simple example:-
function hello () {
return ' Hello, World ' ;
}
Save it in a file called hello.php
. Now how do we know it really runs as expected? Let's create our test procedure:-
$ f3 = require ( ' lib/base.php ' );
// Set up
$ test = new Test ;
include ( ' hello.php ' );
// This is where the tests begin
$ test -> expect (
is_callable ( ' hello ' ),
' hello() is a function '
);
// Another test
$ hello = hello ();
$ test -> expect (
! empty ( $ hello ),
' Something was returned '
);
// This test should succeed
$ test ->expect
is_string ( $ hello ),
' Return value is a string '
);
// This test is bound to fail
$ test -> expect (
strlen ( $ hello )== 13 ,
' String length is 13 '
);
// Display the results ; not MVC but let ' s keep it simple
foreach ( $ test -> results () as $ result ) {
echo $ result [ ' text ' ]. ' <br /> ' ;
if ( $ result [ ' status ' ])
echo ' Pass ' ;
else
echo ' Fail ( ' . $ result [ ' source ' ]. ' ) ' ;
echo ' <br /> ' ;
}
Save it in a file called test.php
. This way we can preserve the integrity of hello.php
.
Now here's the meat of our unit testing process.
F3's built-in Test
class keeps track of the result of each expect()
call. The output of $test->results()
is an array of arrays with the keys text
(mirroring argument 2 of expect()
), status
(boolean representing the result of a test), and source
(file name/line number of the specific test) to aid in debugging.
Fat-Free gives you the freedom to display test results in any way you want. You can have the output in plain text or even a nice-looking HTML template. So how do we run our unit test? If you saved test.php
in the document root folder, you can just open your browser and specify the address http://localhost/test.php
. Das ist alles.
F3 gives you the ability to simulate HTTP requests from within your PHP program so you can test the behavior of a particular route. Here's a simple mock request:-
$ f3 -> mock ( ' GET /test?foo=bar ' );
To mock a POST request and submit a simulated HTML form:-
$ f3 -> mock ( ' POST /test ' ,[ ' foo ' => ' bar ' ]);
Once you get the hang of testing the smallest units of your application, you can then move on to the bigger components, modules, and subsystems - checking along the way if the parts are correctly communicating with each other. Testing manageable chunks of code leads to more reliable programs that work as you expect, and weaves the testing process into the fabric of your development cycle. The question to ask yourself is:- Have I tested all possible scenarios? More often than not, those situations that have not been taken into consideration are the likely causes of bugs. Unit testing helps a lot in minimizing these occurrences. Even a few tests on each fixture can greatly reduce headaches. On the other hand, writing applications without unit testing at all invites trouble.
string AGENT
Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7) AppleWebKit/537.31
. bool AJAX
TRUE
if an XML HTTP request is detected, FALSE
otherwise. string AUTOLOAD
|
), comma ( ,
), or semi-colon ( ;
) as path separator. string BASE
index.php
main/front controller. string BODY
bool/string CACHE
'memcache=localhost'
(and the PHP memcache module is present), F3 auto-detects the presence of APC, WinCache and XCache and uses the first available PHP module if set to TRUE. If none of these PHP modules are available, a filesystem-based backend is used (default directory: tmp/cache
). The framework disables the cache engine if assigned a FALSE
value. bool CASELESS
FALSE
to make it case-sensitive. array COOKIE, GET, POST, REQUEST, SESSION, FILES, SERVER, ENV
integer DEBUG
string DNSBL
403 Forbidden
error if the user's IPv4 address is listed on the specified server(s). array DIACRITICS
string ENCODING
UTF-8
. array ERROR
ERROR.code
is the HTTP status code. ERROR.status
contains a brief description of the error. ERROR.text
provides more detail. For HTTP 500 errors, use ERROR.trace
to retrieve the stack trace. bool ESCAPE
string EXEMPT
string FALLBACK
bool HALT
array HEADERS
bool HIGHLIGHT
TRUE
(requires code.css
stylesheet). string HOST
$_SERVER['SERVER_NAME']
is not available, return value of gethostname()
is used. string IP
array JAR
string LANGUAGE
LOCALES
. If set to NULL
, language is auto-detected from the HTTP Accept-Language
request header. string LOCALES
string LOGS
mixed ONERROR
string PACKAGE
array PARAMS
route()
pattern. PARAMS.0
contains the captured URL relative to the Web root. string PATTERN
string PLUGINS
base.php
. int PORT
string PREFIX
bool QUIET
bool RAW
BODY
. Should be TRUE when processing large data coming from php://input
which will not fit in memory. Default value: FALSE
string REALM
string RESPONSE
QUIET
setting. string ROOT
array ROUTES
string SCHEME
http
or https
. string SERIALIZER
php
, unless PHP igbinary
extension is auto-detected. Assign json
if desired. string TEMP
tmp/
folder inside the Web root. Adjust accordingly to conform to your site's security policies. string TZ
date_default_timezone_set()
function. string UI
View
and Template
classes' render()
method. Default value is the Web root. Accepts a pipe ( |
), comma ( ,
), or semi-colon ( ;
) as separator for multiple paths. callback UNLOAD
string UPLOADS
string URI
string VERB
string VERSION
@token
@token
with value of equivalent F3 variable. {{ mixed expr }}
expr
may include template tokens, constants, operators (unary, arithmetic, ternary and relational), parentheses, data type converters, and functions. If not an attribute of a template directive, result is echoed. {{ string expr | raw }}
expr
. F3 auto-escapes strings by default. {{ string expr | esc }}
expr
. This is the default framework behavior. The | esc
suffix is only necessary if ESCAPE
global variable is set to FALSE
. {{ string expr, arg1, ..., argN | format }}
expr
and pass the comma-separated arguments, where arg1, ..., argn
is one of:- 'date'
, 'time'
, 'number, integer'
, 'number, currency'
, or 'number, percent'
. <include
[ if="{{ bool condition }}" ]
href="{{ string subtemplate }}"
/>
subtemplate
and insert at current position in template if optional condition is TRUE
. <exclude>text-block</exclude>
text-block
at runtime. Used for embedding comments in templates. <ignore>text-block</ignore>
text-block
as-is, without interpretation/modification by the template engine. <check if="{{ bool condition }}">
<true>true-block</true>
<false>false-block</false>
</check>
TRUE
, then true-block
is rendered. Otherwise, false-block
is used. <loop
from="{{ statement }}"
to="{{ bool expr }}"
[ step="{{ statement }}" ]>
text-block
</loop>
from
statement once. Check if the expression in the to
attribute is TRUE
, render text-block
and evaluate step
statement. Repeat iteration until to
expression is FALSE
. <repeat
group="{{ array @group|expr }}"
[ key="{{ scalar @key }}" ]
value="{{ mixed @value }}"
[ counter="{{ scalar @key }}" ]>
text-block
</repeat>
text-block
as many times as there are elements in the array variable @group
or the expression expr
. @key
and @value
function in the same manner as the key-value pair in the equivalent PHP foreach()
statement. Variable represented by key
in counter
attribute increments by 1
with every iteration. <switch expr="{{ scalar expr }}">
<case value="{{ scalar @value|expr }}" break="{{ bool TRUE|FALSE }}">
text-block
</case>
.
.
.
</switch>
{* text-block *}
<exclude>
.The most up-to-date documentation is located at http://fatfreeframework.com/. It contains examples of usage of the various framework components.
Technical support is available at the official discussion forum: https://groups.google.com/forum/#!forum/f3-framework
. If you need live support, you can talk to the development team and other members of the F3 community via Slack or IRC. We're on the FreeNode #fatfree
channel ( chat.freenode.net
). Visit http://webchat.freenode.net/
to join the conversation. You can also download the Firefox Chatzilla add-on or Pidgin if you don't have an IRC client so you can participate in the live chat. You can also find help at Stack Overflow
F3 uses Git for version control. To clone the latest code repository on GitHub:
git clone git://github.com/bcosca/fatfree-core.git
If all you want is a zipball of our test bench with all unit tests, grab it here .
To file a bug report, visit https://github.com/bcosca/fatfree-core/issues
.
Fat-Free Framework is free and released as open source software covered by the terms of the GNU Public License (GPL v3). You may not use the software, documentation, and samples except in compliance with the license. If the terms and conditions of this license are too restrictive for your use, alternative licensing is available for a very reasonable fee.
If you feel that this software is one great weapon to have in your programming arsenal, it saves you a lot of time and money, use it for commercial gain or in your business organization, please consider making a donation to the project. A significant amount of time, effort, and money has been spent on this project. Your donations help keep this project alive and the development team motivated. Donors and sponsors get priority support (24-hour response time on business days).
The Fat-Free Framework is community-driven software. It can't be what it is today without the help and support from the following people and organizations:
Special thanks to the selfless others who expressed their desire to remain anonymous, yet share their time, contribute code, send donations, promote the framework to a wider audience, as well as provide encouragement and regular financial assistance. Their generosity is F3's prime motivation.
By making a donation to this project you signify that you acknowledged, understood, accepted, and agreed to the terms and conditions contained in this notice. Your donation to the Fat-Free Framework project is voluntary and is not a fee for any services, goods, or advantages, and making a donation to the project does not entitle you to any services, goods, or advantages. We have the right to use the money you donate to the Fat-Free Framework project in any lawful way and for any lawful purpose we see fit and we are not obligated to disclose the way and purpose to any party unless required by applicable law. Although Fat-Free Framework is free software, to our best knowledge this project does not have any tax-exempt status. The Fat-Free Framework project is neither a registered non-profit corporation nor a registered charity in any country. Your donation may or may not be tax-deductible; please consult this with your tax advisor. We will not publish/disclose your name and e-mail address without your consent, unless required by applicable law. Your donation is non-refundable.
Copyright (c) 2009-2022 F3::Factory/Bong Cosca <[email protected]>
Hey dude! Help me out for a couple of !