Hallo,
da ich jetzt schon des öfteren hier Threads gelesen wie z.B. diesen oder den hier, hab ich mir gedacht ich schreib mal ein Tutorial wie man sowas lösen könnte.
In diesem Tutorial zeig ich euch wie man einen Front Controller, einen AutoLoader und eine ganz kleine Template Klasse in PHP (version 5) schreibt.
Zuerst legen wir die Verzeichnisstruktur und die benötigten Dateien an.
/
| - index.php
| - .htaccess
| + core
| |- FrontController.class.php
| |- AutoLoader.class.php
| |- Template.class.php
| |- Action.class.php
|+ modules
|+ main
|+ actions
| |- Main.class.php
|+ classes
|+templates
| |- Main.tpl.php
Was wofür ist wird später erklärt. Aber schon mal ein kurzes Vorwort zum core und modules Verzeichnis, im core werden nur wichtige Klassen und Libriers abgelegt. Im modules Verzeichnis werden die eigentlichen "Seiten" der Homepage abgelegt. Dazu aber später mehr.
So, jetzt haben wir alle Verzeichnisse und Dateien angelegt die wir brauchen. Beginnen wir also mit der implementierung des Front Controllers.
"Liebe Bastelfreunde, ich hab da schon mal was vorbereitet."
FrontController.class.php
Ok, das war schonmal der Front Controller. Jetzt erstellen wir noch schnell die index.php
Und das ist die index.php, mal überlegen ob ich alles für den ersten Teil habe. Ach ja, stimmt uns fehlt ja noch die .htaccess Datei.
.htaccess
Das wars dann auch schon mit dem ersten Teil des Tutorials.
Ich hoffe mal der eine oder andere kann was damit anfangen.
Fragen könnt Ihr ja hier posten oder mir per PM schicken.
da ich jetzt schon des öfteren hier Threads gelesen wie z.B. diesen oder den hier, hab ich mir gedacht ich schreib mal ein Tutorial wie man sowas lösen könnte.
In diesem Tutorial zeig ich euch wie man einen Front Controller, einen AutoLoader und eine ganz kleine Template Klasse in PHP (version 5) schreibt.
Zuerst legen wir die Verzeichnisstruktur und die benötigten Dateien an.
/
| - index.php
| - .htaccess
| + core
| |- FrontController.class.php
| |- AutoLoader.class.php
| |- Template.class.php
| |- Action.class.php
|+ modules
|+ main
|+ actions
| |- Main.class.php
|+ classes
|+templates
| |- Main.tpl.php
Was wofür ist wird später erklärt. Aber schon mal ein kurzes Vorwort zum core und modules Verzeichnis, im core werden nur wichtige Klassen und Libriers abgelegt. Im modules Verzeichnis werden die eigentlichen "Seiten" der Homepage abgelegt. Dazu aber später mehr.
So, jetzt haben wir alle Verzeichnisse und Dateien angelegt die wir brauchen. Beginnen wir also mit der implementierung des Front Controllers.
"Liebe Bastelfreunde, ich hab da schon mal was vorbereitet."

FrontController.class.php
PHP:
<?php
//Hier includieren wir den AutoLoader, den wir aber erst später implementieren
require_once('core/AutoLoader.class.php');
class FrontController {
//Hier wird der Pfad zum Wurzelverzeichnis gespeichert
private $rootPath;
//Singleton Pattern -> Hier wird eine Instanz der FrontControllers gespeichert
private static $instance = null;
//Hier wird die Action festgelegt die nach dem Aufruf der Seite angezeigt werden soll.
//Das ganze könnte man natürlich auch aus einer Config lesen.
private $firstAction = 'main.Main';
//In dieser Variable wird immer die letzte Action gespeichert
private $lastAction;
//Der Konstruktor erwartet als Parameter den Pfad zum Wurzelverzeichnis
public function __construct($rootPath) {
$this->rootPath = $rootPath;
//Alle Klasse die man ständig braucht, werden hier geladen.
AutoLoader::addPackage('core/Template.class.php');
AutoLoader::addPackage('core/Action.class.php');
}
public function __destruct() {
}
// Der Front Controller wird als Singleton Pattern implementiert, da wir ja nur eine Instanz pro Request haben wollen.
public static function getInstance($rootPath = null) {
// Falls es noch keine Instanz des FrontControllers gibt, wird hier eine instanziert.
if (! is_object(self::$instance)) {
if (is_null($rootPath)) {
throw new Exception('Es muss der Rootpfad angegeben werden!');
}
// Instanzieren des Front Controllers
self::$instance = new FrontController($rootPath);
}
// Instanz des FrontControllers zurück geben.
return self::$instance;
}
// Die run Methode wird bei jedem Request aufgerufen.
public function run() {
// Hier die aufgerufene Action aus dem Request gelesen.
$completeName = $_REQUEST['action'];
// In diesem Codeblock wird geprüft, ob eine Action übergeben/aufgerufen wurde oder nicht.
// Wenn keine Action übergeben/aufgerufen wurde, wird die First Action ausgeführt.
try {
if (! empty($completeName)) {
$this->executeAction($completeName);
} else {
$this->executeAction($this->firstAction);
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
//Diese Methode ist das eigentlich Kernstück des Front Controllers.
// Hier wird geschaut ob es das aufgerufene Module und die Action
// überhaupt gibt.
private function executeAction($completeName) {
// Hier wird der Request String in seine einzelteile zerlegt.
// Ein Aufruf einer Action sieht folgendermaßen aus,
// main.Main.html
// | | |- Wird durch mod-rewrite schon abgeschnitten
// | |- Die Action die ausgeführt werden soll
// |- Das Module in der sich die Action befindet
$actionName = self::getActionName($completeName);
$moduleName = self::getModuleName($completeName);
// Hier wird geprüft ob es das Module überhaupt gibt, falls nicht wird eine Exception geworfen
if (! is_dir('./modules/' . $moduleName)) {
throw new Exception('Das angegebene Modul existiert nicht!');
}
// Prüfen, ob es die Action überhaupt gibt, falls nicht wirf dem User eine Exception vor die Füße
if (! is_file('./modules/' . $moduleName . '/actions/' . $actionName . '.class.php')) {
throw new Exception('Die angegebene Action existiert nicht!');
}
// Action includieren
require_once('./modules/' . $moduleName . '/actions/' . $actionName . '.class.php');
// Neue Instanz der Action erzeugen
$action = new $actionName();
if (! is_object($action)) {
throw new Exception('Die Action konnte nicht initialisiert werden!');
}
// Action ausführen
try {
$action->run();
} catch (Exception $e) {
echo $e->getMessage();
}
//lastAction mit der aktuell aufgerufenen Action ersetzen
$this->lastAction = $completeName;
}
// Diese Methode brauchen wir später fürs Template
public function includeAction($completeName) {
$this->executeAction($completeName);
}
//Extrahiert den Actionname aus dem Request String
public static function getActionName($completeName) {
return substr($completeName, strrpos($completeName, ".") + 1);
}
//Extrahiert den Modulename aus dem Request String
public static function getModuleName($completeName) {
return substr($completeName, 0, strrpos($completeName, "."));
}
}
?>
Ok, das war schonmal der Front Controller. Jetzt erstellen wir noch schnell die index.php
PHP:
<?php
//Auslesen des Wurzelverzeichnisses
$root = dirname(__FILE__);
//FrontController includieren
require_once($root . '/core/FrontController.class.php');
// Instanzieren des Front Controllers
$main = FrontController::getInstance($root);
if (is_object($main)) {
// Front Controller starten
$main->run();
}
?>
Und das ist die index.php, mal überlegen ob ich alles für den ersten Teil habe. Ach ja, stimmt uns fehlt ja noch die .htaccess Datei.
.htaccess
Code:
php_flag register_globals off
# Umschreiben der *.html-URLs in entsprechende action-Parameter:
RewriteEngine on
RewriteRule ^([^/]+)\.html$ index.php?action=$1&mod_rewrite=true [QSA]
Das wars dann auch schon mit dem ersten Teil des Tutorials.
Ich hoffe mal der eine oder andere kann was damit anfangen.
Fragen könnt Ihr ja hier posten oder mir per PM schicken.