Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

URL роутинг на PHP

Начал разбираться в 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/

Комментариев нет:

Отправить комментарий