Вот решил сам написать роутинг, пока ничего не получается, пытаюсь понять почему.
Подскажите как можно сделать адекватный и удобный роутинг.
Router
final class Router extends RouterRules{
private $app;
public function __construct($app) {
$this->app = $app;
parent::__construct();
}
public function createRule($url, $controller, $action='', array $parameters=array()) {
$this->routes[$url] = array('Controller'=>$controller,
'Action'=>(empty($action)) ? 'index' : $action,
'Data'=>implode('&',$parameters);
}
public function getRule($url) {
if(array_key_exists($url, $this->routes)) {
return $this->routes[$url];
} else {
$url = trim($url,'/');
$url = explode('/', $url);
$class = $this->app->factory->getController($url[0]);
if(is_object($class)) {
$arr['Controller'] = $url[0];
if((!empty($url[1])) && (method_exists($class, $url[1]))) {
$arr['Action'] = $url[1];
$arr['Data'] = (!empty($url[2])) ? $url[2] : null;
} elseif(empty($url[1])) {
$arr['Action'] = 'index';
$arr['Data'] = null;
} else {
return $this->routes['405'];
}
return $arr;
} else {
return $this->routes['404'];
}
}
}
public function getRoutes() {
return $this->routes;
}
}
RouterRules
class RouterRules {
protected $routes;
protected function __construct() {
$this->getSystemRoutes();
$this->getRoutes();
}
private function getRoutes() {
$this->routes['/'] = array('Controller'=>'chart', 'Action'=>'main', 'Data'=>null);
$this->routes['/cabinet'] = array('Controller'=>'tickets', 'Action'=>'cabinet', 'Data'=>null);
$this->routes['/cabinet/my'] = array('Controller'=>'tickets', 'Action'=>'cabinet', 'Data'=>'user=#{id}');
$this->routes['/leadgens'] = array('Controller'=>'tickets', 'Action'=>'leadgens', 'Data'=>'user=#{id}');
$this->routes['/leadgens/@{status}'] = array('Controller'=>'tickets', 'Action'=>'leadgens', 'Data'=>'user=#{id}&status={status}');
$this->routes['/leadgens/@{name}'] = array('Controller'=>'tickets', 'Action'=>'leadgens', 'Data'=>'user=#{id}&name={name}');
$this->routes['/leadgens/@{name}/@{status}'] = array('Controller'=>'tickets', 'Action'=>'leadgens','Data'=>'user=#{id}&name=@{name}&status=@{status}');
}
private function getSystemRoutes() {
$this->routes['405'] = array('Controller'=>'errors',
'Msg'=>'Method Not Allowed',
'Code'=>405);
$this->routes['404'] = array('Controller'=>'errors',
'Msg'=>'Not Found',
'Code'=>404);
$this->routes['403'] = array('Controller'=>'errors',
'Msg'=>'Access denied',
'Code'=>403);
}
}
Если честно я не столько за критикой, сколько за направлением поэтому прошу быть посдержаннее =)
Вопроса собственно 2:
1. Как сделать так чтобы роутер обрабатывал правила типа @{name}/#{id}. Т.е. чтобы он подставлял значения и генерировал роуты для таких вариантов урла
2. Как сделать, чтобы то, что было записано в Data, было передано в метод контроллера вызванной страницы но не как одна строка типа name=Вася&id=1, а как прям отдельные переменные, или так не делают? Подскажите как сделать.
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки