Начал разбираться в MVC PHP, после множества прочитанных статей и просмотренных видео уроков накатал каркас своего приложения. (Сразу попрошу не советовать использовать готовые решение, я хочу изобрести собственный велосипед, так мне легче во всем разобраться). Схема стандартная все запросы идут на index.php, в роутере разбираю URL на controller, action, params. Ну с этим проблем нет. URL получаются такого вида: http://localhost/categories/sport, где categories - имя контроллера, а sport - action. Потом создаю второй контроллер к примеру articles, URL - http://localhost/articles/football ну и все по прежней схеме. Вопрос: как создать ссылку вида http://localhost/categories/sport/articles/football, или http://localhost/categories/sport/football Только так чтобы не писать все в одном контроллере.
Вот класс роутера:
class Router {
protected $uri;
protected $controller;
protected $action;
protected $params;
protected $route;
protected $method_prefix;
protected $language;
public function getUri() {
return $this->uri;
}
public function getController() {
return $this->controller;
}
public function getAction() {
return $this->action;
}
public function getParams() {
return $this->params;
}
public function getRoute() {
return $this->route;
}
public function getMethodPrefix() {
return $this->method_prefix;
}
public function getLanguage() {
return $this->language;
}
public function __construct($uri) {
$this->uri = urldecode(trim($uri, '/'));
// Get defaults
$routes = Config::get('routes');
$this->route = Config::get('default_route');
$this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : '';
$this->language = Config::get('default_language');
$this->controller = Config::get('default_controller');
$this->action = Config::get('default_action');
$uri_parts = explode('?', $this->uri);
// Get path like /lng/controller/action/param1/param2/
$path = mb_substr($uri_parts[0], 14);
$path_parts = explode('/', $path);
if(count($path_parts)) {
// Get route at first element
if(in_array(strtolower(current($path_parts)), array_keys($routes))) {
$this->route = strtolower(current($path_parts));
$this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : '';
array_shift($path_parts);
} elseif(in_array(strtolower(current($path_parts)), Config::get('languages'))) {
$this->language = strtolower(current($path_parts));
array_shift($path_parts);
}
//Get controller - next element of array
if(current($path_parts)) {
$this->controller = strtolower(current($path_parts));
array_shift($path_parts);
}
//Get action
if(current($path_parts)) {
$this->action = strtolower(current($path_parts));
array_shift($path_parts);
}
//Get params - all the rest
$this->params = $path_parts;
}
}
public static function redirect($location) {
header("Location: $location");
exit();
}
public static function notFound() {
header('HTTP/1.0 404 Not Found');
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
return true;
}
}
Ответ
Закрываю вопрос, после долгих поисков нашел, и решил использовать AltoRouter, рекомендую всем: http://altorouter.com/
Комментариев нет:
Отправить комментарий