URL роутинг на PHP

479
25 декабря 2016, 22:42

Начал разбираться в 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. Только так чтобы не писать все в одном контроллере.

Вот класс роутера:

<?php
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;
}
}
READ ALSO
Отслеживать посещения по IP

Отслеживать посещения по IP

Как на PHP сделать подсчет посещений по iP? На сайте есть задание, которое можно выполнить не более 5 раз, и нужно чтобы при входе с помощью $_SERVER["REMOTE_ADDR"];...

372
установка sleeping-owl на Laravel

установка sleeping-owl на Laravel

php artisan admin:install Copied Directory [\vendor\sleeping-owl\admin\src\migrations] To [\database\migrations] Copied Directory [\vendor\sleeping-owl\admin\public] To [\public\packages\sleeping-owl\admin] Publishing complete for tag []! [PDOException]...

610
Рекурсия массивов в php

Рекурсия массивов в php

Подскажите, пожалуйста, как работает рекурсия, и как написать такую функцию, чтоб она могла проходить по всему массиву и удалить определённый...

595