Vereinfacht gesagt besteht die Aufgabe des Verantwortlichen darin, Anfragen entgegenzunehmen. Es verwendet die get-Methode, in diesem Fall über URI, um einen Funktionsbaustein zu laden, um eine Präsentationsebene zu aktualisieren oder zu übermitteln. Der Controller verwendet die automatische globale Variable $_GET, um zu bestimmen, welches Modul geladen werden soll.
Ein Beispiel für eine Anfrage würde so aussehen:
http://example.com/index.php?module=login
Das scheint einfach, ist es aber im Implementierungsprozess nicht. Hier sind die Argumentteile, die von mehreren Controllern erkannt werden können:
Modul definiert, welches Modul verwendet werden soll, z. B. Benutzer. Modulklasse definiert, welche Funktionsklasse verwendet werden soll, z. B. ob Benutzer sich an- oder abmelden sollen.
Ein komplexeres Beispiel kann die Anforderungs-URL erklären, die letztendlich aus jedem der oben genannten Argumente besteht:
http://example.com/index.php?module=users&class=login
Diese Anforderung teilt dem Controller mit Es sollte das Benutzermodul und dann die Anmeldeklasse laden und schließlich das Standardereignis login::__default() ausführen, da kein spezifisches Ereignis definiert ist.
Das Folgende ist der spezifische Codeteil:
<?php
/**
*index.php
*
* @Autor Joe Stump < [email protected] >
* @copyright Joe Stump < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php');
// {{{ __autoload($class)
/**
* __autoload
*
* Autoload wird von PHP ausgeführt, wenn es eine Klasse, die es laden möchte, nicht finden kann.
* Durch die intelligente Benennung unserer Klassen sollten wir in der Lage sein, die meisten Klassen zu laden
* dynamisch.
*
* @Autor Joe Stump < [email protected] >
* @param string $class Klassenname, den wir laden möchten
* @return void
* @packageFramework
*/
Funktion __autoload($class)
{
$file = str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
}
// }}}
if (isset($_GET['module'])) {
$module = $_GET['module'];
if (isset($_GET['event'])) {
$event = $_GET['event'];
} anders {
$event = '__default';
}
if (isset($_GET['class'])) {
$class = $_GET['class'];
} anders {
$class = $module;
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
if (file_exists($classFile)) {
require_once($classFile);
if (class_exists($class)) {
versuchen {
$instance = new $class();
if (!FR_Module::isValid($instance)) {
die("Angefordertes Modul ist kein gültiges Framework-Modul!");
}
$instance->moduleName = $module;
if ($instance->authenticate()) {
versuchen {
$result = $instance->$event();
if (!PEAR::isError($result)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance);
if (!PEAR::isError($presenter)) {
$presenter->display();
} anders {
die($presenter->getMessage());
}
}
} Catch (Ausnahme $error) {
die($error->getMessage());
}
} anders {
die("Sie haben keinen Zugriff auf die angeforderte Seite!");
}
} Catch (Ausnahme $error) {
die($error->getMessage());
}
} anders {
die("Es wurde kein gültiges Modul für Ihre Anfrage gefunden");
}
} anders {
die("Konnte nicht finden: $classFile");
}
} anders {
die("Es wurde kein gültiges Modul angegeben");
}
?>
Das Folgende sind die spezifischen Kommentare zum obigen Code:
Laden Sie „config.php“,
um die Funktion __autoload() zu definieren. Dies ist eine neue Funktion in PHP5, die das dynamische Laden verschiedener Klassen erleichtert.
Wenn ein Argument definiert ist, werden die relevanten Module, Klassen und spezifischen Ereignisse geladen,
gefolgt von einigen Beurteilungen und spezifischen Fehleroperationen.
Nachdem alles korrekt ist, wirddie
Präsentationsebene
[freundliche URL]
geladenIm obigen Beispiel wird Folgendes erwähnt: Wenn Sie sich dabei unwohl fühlen, verwenden Sie mod_rewrite, um benutzerfreundliche URLs zu implementieren. Als nächstes folgt der eigentliche Standardcode zum Umschreiben, der vom Autor für dieses Framework geschrieben wurde:
RewriteEngine On
# Ändern Sie den URI hier in den gewünschten Namen Ihrer Homepage. RewriteRule
^/$ /index.php?module=welcome [L,QSA]
# Änderungen / index.php?module=Willkommen bei /welcome
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index. php?module=$1 [L,QSA]
# Ändert /index.php?module=users&class=login zu /users/login
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# Änderungen /index.php?module=users&class=login&event =foo
# zu /users/login/foo.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
Erweiterung des Controllers
[Extended Controller]
verfügt über einen zentralen Controller. Einer von Der Vorteil besteht darin, dass einige Funktionen nach dem Hinzufügen sofort über den Controller wiedergegeben werden können. Hier ein paar Ideen zur Erweiterung dieses Controllers, um das Framework insgesamt leistungsfähiger zu machen:
Sie können SoapServer, eine neue Funktion in PHP5, verwenden, um automatisch zu erkennen, ob es sich bei einer Anfrage um SOAP handelt.
Sie können Controller verwenden, um alle automatischen globalen Variablen wie $_GET und $_POST zu filtern, um bösartigen HTML-Code usw. zu
verhindern Konvertieren Sie Ausdrücke im Handumdrehen, beispielsweise vom Standardmodus in den PDF-Modus
. Dies hat den Vorteil, dass die gesamte Anwendung den Cache nutzen kann, um die Effizienz zu verbessern
. Beachten Sie, dass sich die hinzugefügte Funktionalität im gesamten Programm widerspiegelt. Sie möchten beispielsweise alle automatischen globalen Variablen filtern, aber viele Anwendungsadministratoren müssen HTML-Code verwenden, was zu einer schwierigen Sache wird (Anmerkung des Übersetzers: Meine Idee ist, eine if-Bedingungsanweisung hinzuzufügen, um ein bestimmtes Modul zu laden, ohne die Filterung anzuwenden Funktion).