Здравствуйте!
Прописываю маршруты в виде регулярных выражений.
Ниже класс маршрутизатора и пример маршрутов.
Интересует:
1. на сколько это коряво?
2. на сколько это небезопасно?
3. на сколько это небыстро?
4. стоит ли вообще так делать?
5. что посоветуете?
Класс маршрутизатора.
<?php
class DRouter {
private function setMCA($urlData, $routes) {
$str = 'controller=site&action=error';
foreach(require $routes as $pattern => $route) {
if (preg_match('/'.addcslashes($pattern, '/').'/i', $urlData['path'])) {
$str = preg_replace('/' . addcslashes($pattern, '/') . '/i', $route, $urlData['path']);
break;
}
}
parse_str($str, $data);
D::app()->request = $data;
D::app()->request['module'] = (!empty($data['module'])) ? 'modules/'.$data['module'].'/' : '';
D::app()->request['controller'] = (!empty($data['controller'])) ? $data['controller'] : 'site';
D::app()->request['action'] = (!empty($data['action'])) ? $data['action'] : 'index';
unset($data,$str);
return $this;
}
public static function run($routes) {
$oi = new self();
$oi->setMCA(parse_url($_SERVER['REQUEST_URI']), $routes);
if (!class_exists(D::app()->request['controller'].'Controller'))
throw new DException('Страница не найдена', 404);
if (!method_exists(D::app()->request['controller'].'Controller', D::app()->request['action'].'Action'))
throw new DException('Страница не найдена', 404);
$oi->forward(D::app()->request['controller'], D::app()->request['action']);
}
public static function forward($controller='site', $action='index', $data=null) {
$controller = $controller.'Controller';
$action = $action.'Action';
$oi = new $controller();
$oi->$action($data);
if (method_exists($controller, 'run'))
$controller->run();
if (method_exists($controller, 'init'))
$controller->init();
}
}
Непосредственно сами маршруты
<?php
return array(
'^/$' => 'controller=site&action=index',
'^/admin(?:/|)$' => 'module=admin&controller=site&action=index',
'^/admin/([a-z0-9]{1,15})(?:/|)$' => 'module=admin&controller=$1&action=index',
'^/admin/([a-z0-9]{1,15})/([0-9]{1,15})(?:/|)$' => 'module=admin&controller=$1&action=view&id=$2',
'^/admin/([a-z0-9]{1,15})/([a-z0-9]{1,15})(?:/|)$' => 'module=admin&controller=$1&action=$2',
'^/([a-z0-9]{1,15})(?:/|)$' => 'controller=$1&action=index',
'^/([a-z0-9]{1,15})/([0-9]{1,15})(?:/|)$' => 'controller=$1&action=view&id=$2',
'^/([a-z0-9]{1,15})/([a-z0-9]{1,15})(?:/|)$' => 'controller=$1&action=$2',
'^/([a-z0-9]{1,15})/([a-z0-9]{1,15})/([0-9]{1,15})(?:/|)$' => 'controller=$1&action=$2&id=$3',
'^(.*)$' => 'controller=site&action=error',
);