Hallo,
ich hab mal wieder was geschrieben.
Und zwar eine Router-Klasse. Diese Routet Seitenaufrufe auf einzelne Seiten.
Beispiel zur Verwendung:
<?php require_once('sysRouter.class.php'); $routes = array( '/' => 'start@Index', '/foo' => 'foo@Index', '/foo/([a-zA-Z0-9_]+)/view' => 'view@Foo', ':error' => 'error@Index', ':end' => '' ); new sysRouter($routes, array( 'request' => '/foo/1w3435/view' // zum testen ));?>
Zur Verwendung:
Die Klassen müssen selbst geladen werden, beispielsweise per Autoload.
Es wird eine Instanz der Klasse erzeugt, welche man mit $router->getController() bekommt.
Nach dem erzeugen der Instanz wird die Funktion aufgerufen und alle Stellen aus dem Regulärem Ausdruck als Parameter übergeben. Beispiel: start@Index ruft die Methode start der Klasse Index auf und übergibt keinen Parameter, da der Reguläre ausdruck keine Stellen hat.
Zum Testen kann man beim Aufrufen des Routers als zweiten Parameter ein optionales Array mit einem Request angeben. Lässt man diesen weg, wird $_SERVER['REQUEST_URI'] verwendet.
Eine .htaccess, die alle Aufrufe auf die index.php leitet wird noch benötigt.
Router:
<?php
class sysRouter {
protected $controller;
public $routes = array();
protected $options = array(
'request' => null
);
public function __construct ($routes, $options = array()) {
$this->routes = $routes;
$this->options = array_merge($this->options, $options);
if (!$this->options['request'] === null)
$this->options['request'] = $_SERVER['REQUEST_URI'];
foreach ($this->routes as $route => $class) {
if (!(preg_match("/^".str_replace('/', '\/', $route)."\/?$/", $this->options['request'], $match)
or ($route == ':error' && $this->options['request'] == ':error')
or ($route == ':end')
)) continue;
if ($route == ':end') $class = $this->routes[':error'];
if (substr($route, 0, 1) == ':') $match = array();
list($method, $className) = explode('@', $class, 2);
if (!class_exists($className)) {
$this->options['request'] = ':error';
continue;
}
$this->controller = new $className();
if (!method_exists($this->controller, $method)) {
$this->options['request'] = ':error';
continue;
}
array_shift($match);
call_user_func_array(array($this->controller, $method), $match);
break;
}
}
public function getController () {
return $this->controller;
}
}
?>
Alles anzeigen
Download:
http://fridoliiin.de/chris/_ex…chnippsel/php?codeblock=3
Weitere Infos unter http://fridoliiin.de/chris/codeschnippsel/php#router :)
Viele Grüße,
Chris