MVC und mehr mit weniger als 40kb.
Dieser Beitrag ist bereits veraltet. Die aktuelle, jedoch nicht finale Version von Zarge findet sich bei Github.
Vor einiger Zeit habe ich damit begonnen ein eigenes kleines MVC-Framework für meinen persönlichen Gebrauch zu entwerfen. Heraus gekommen ist ein Framework, welches etwas mehr bietet als nur MVC und mit 39kb zudem sehr leicht ist. Zarge nennt es sich, läuft nur unter PHP 5.3 und bietet folgende Komponenten.
Basisklassen
MVC-Klassen
Datenbank-Klassen
- DB
- Query
Sonstige-Klassen
- Request
- Session
- Registry
- Cache
Zarge
Die Basisklasse Zarge startet eine lauffähige MVC-Anwendung und enthält die gesamte Konfiguration sowie alle benötigten Parameter der Anwendung. Übergeben werden müssen zum einen die Konfigurationsdaten ($config) als Array oder Dateipfad, die Parameter für die Anwendung ($params) ebenfalls als Array oder Dateipfad sowie die URI ($request), welche anschließend vom Framework anaylsiert wird.
$config = array(
'application' => array(
'start' => 'index',
'name' => 'Testanwendung',
'basePath' => '../test/htdocs/',
'protectedPath' => 'protected/',
'modulePath' => 'modules/'
),
'autoload' => true,
'import' => array(),
'routes' => array(
'parse' => array(
array('[:misc].[:misc]', '[:1]/extension/[:2]')
),
'build' => array(
array('[:misc]/extension/[:char]', '[:1].[:2]'),
)
),
'db' => array(
'host' => 'localhost',
'name' => 'test',
'user' => 'root',
'password' => ''
),
'cache' => array(
'compress' => true,
'time' => 3600,
'cachePath' => 'protected/cache/'
),
'specialChars' => array(
'original' => array('Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß'),
'replace' => array('Ae', 'ae', 'Oe', 'oe', 'Ue', 'ue', 'ss')
)
);
$params = 'protected/config/params.php';
require_once('../../zarge/Zarge.php');
Zarge::config($config)->params($params)->run($request);
Es stehen folgende Methoden zur Verfügung, die meisten davon sind selbsterklärend und dienen dazu Konfigurationsdaten oder Parameter zu holen oder zu setzen. Die Methoden “go” leitet auf eine andere URI um, die Methode “run” startet eine Anwendung indem sie den ihr übergebenen Request auswertet.
- ::config($config)
- getConfig($key)
- setConfig($key, $value)
- params($params)
- getParams($key)
- setParams($key, $value)
- getDetails($key)
- go($request)
- run($request)
ClassLoader
Diese Klasse dient lediglich der Faulheit. Sobald eine Klasse von ihr abgeleitet wird, lädt sie bei der Initialisierung automatisch alle darin benötigten Klassen.
abstract class Controller extends ClassLoader {
protected static $import = array(
'session.Session'
);
[...]
}
Zudem ermöglicht sie auch das maneulle Laden von Klassen. Hierzu muss lediglich ein Array mit Pfaden an die Methode übergeben werden.
- load($paths)
Extensions (Ext)
Diese Klasse bietet einige erweiternde Methoden zur Nutzung von verschiedenen Datentypen, welche hin und wieder Verwendung finden. Jede der darin enthaltenen Methoden verfügt über einen Schnellaufruf. Auf eine nähere Beschreibung der einzelnen Methoden verzichte ich an dieser Stelle, zumal die Namen teiweise bereits selbst erklärend sind.
- to_xml($data, $root = ‘root’)
- int_between($value, $min, $max)
- string_excerpt($string, $minLength = 255, $chars = ‘ ‘, $extension = ‘…’)
- string_replace_doubles($string, $chars)
- string_multi_explode($string, $needles)
- string_explode_slice($string, $needles, $offset = 0, $length = null)
- array_values_by_keys($array, $keys)
- array_get_rekursive($array, $keys = null)
- array_set_rekursive($value, $keys = null, $array = array())
Controller
Die Controller-Klasse ist sehr simpel gehalten und enthält lediglich Getter-Methoden die die Details eines jeweiligen Controllers abgreifen. So enthält jeder Controller eine Standard-Action welche angesprochen wird, sofern im Request keine Action angegeben ist, ein Standard-Model mit welchem, sofern nicht anders gewollt, gearbeitet werden soll und ein Standard-Template in welches ein View hinein gerendert wird.
- ::controller()
- getDefaultModel()
- getDefaultAction()
- getDefaultTemplate()
Model
Das Model ist die wohl wichtigste Klasse dieses Frameworks. Es enthält alle Methoden für eine schnelle Ansprache der Datenbanktabelle. So gibt es diverse Lese- und Schreiboperationen für Datensätze sowie Getter und Setter für alle Attribute eines Datensatzes. Das Model arbeitet sehr eng mit der Query-Klasse zusammen, welche hier jedoch nicht näher beschrieben wird.
Ein neuer Datensatz kann ganz einfach erstellt und in die Datenbank geschrieben, geändert oder gelöscht werden.
// Insert News::model(array( 'data' => $data, ))->insert(); // Update News::model()->updateByPk($id, array( 'data' => $data, )); News::model()->getByPk($id)->setAttributes(array( 'data' => $data, ))->update(); // Delete News::model()->deleteByPk($id); News::model()->getByPk($id)->delete();
- ::model(array $attributes = array())
- getAttributes($attributes = null)
- setAttributes(array $attributes)
- getTable()
- getPrimaryKey()
- __get($attribute)
- __set($attribute, $value)
- generateQuery($query = null)
- count($oQuery = null, $params = array())
- get($oQuery = null, $params = array())
- getByPk($primaryKey, $oQuery = null, $params = array())
- getAll($oQuery = null, $params = array())
- insert()
- update()
- updateByPk($primaryKey, $attributes)
- delete()
- deleteByPk($primaryKey)
View
Die View-Klasse rendert einen View oder Teile eines Views (renderPartial) und baut diese, sofern gesetzt, in ein Template ein.
View::view()->render('news', array(
'data' => $data
));
- ::view()
- template($template = null)
- render($view, $arguments = array(), $cacheView = false)
- renderPartial($view, $arguments = array())
Soweit die Grundlagen des Frameworks. Die Funktionsweise der anderen Klassen ist meiner Meinung nach hinfällig. Es sei nur kurz gesagt, dass die Session-Klasse die Methoden der Standard PHP-Session implementiert, die DB-Klasse mit PDO arbeitet und der Cache sowohl Datensätze wie auch ganze Views oder gar Templates cachen kann. Derzeit arbeite ich noch an weiteren Klassen für dieses Framework, so beispielsweise an einer Anbindung für Couchbase und einer Unterstützung für Mehrsprachigkeit. Zwei Projekte wurden bereits erfolgreich damit umgesetzt und ein drittes, größeres Projekt steht in den Startlöchern und wird damit wohl zur Feuertaufe von Zarge werden.
Keine Kommentare