Задать вопрос
@QNA-1976

Как организовать ЧПУ роутинг?

Роутер

<?php


namespace core;


use Error;

class Router
{
    private static $routes = [];
    private static $route = [];

    private static function removeQueryString($url)
    {
        if ($url) {
            $params = explode('&', $url, 2);
            if (strpos($params[0], '=') === false) {
                return rtrim($params[0], '/');
            }
        }
        return '';
    }

    private static function upperCamelCase($name)
    {
        return str_replace(' ', '', ucwords(str_replace('-', ' ', $name)));
    }

    private static function lowerCamelCase($name)
    {
        return lcfirst(self::upperCamelCase($name));
    }

    private static function matchRoute($url)
    {
        foreach (self::$routes as $pattern => $route) {
            if (preg_match("@{$pattern}@i", $url, $matches)) {
                foreach ($matches as $k => $v) {
                    if (is_string($k)) {
                        $route[$k] = $v;
                    }
                }
                if (!isset($route['action'])) {
                    $route['action'] = 'index';
                }
                self::$route['controller'] = self::upperCamelCase($route['controller']);
                self::$route['action'] = self::lowerCamelCase($route['action']);
                return true;
            }
        }
        return false;
    }

    public static function add($regex, $route = [])
    {
        self::$routes[$regex] = $route;
    }

    public static function dispatch($url)
    {
        if (self::matchRoute(self::removeQueryString($url))) {
            $controller = 'app\controllers\\' . self::$route['controller'] . 'Controller';
            if (class_exists($controller)) {
                $cObj = new $controller(self::$route);
                $action = self::$route['action'] . 'Action';
                if (method_exists($cObj, $action)) {
                    $cObj->$action();
                    $cObj->getView();
                } else {
                    throw new Error("Метод {$controller}::{$action} не найден", 404);
                }
            } else {
                throw new Error("Контроллер {$controller} не найден", 404);
            }
        } else {
            throw new Error('Страница не найдена', 404);
        }
    }
}


.htaccess
DirectorySlash off

RewriteEngine on

RewriteCond %{HTTPS}_%{HTTP_HOST} ^(?|off_(?:www\.)?(.*)|on_www\.(.*)) [NC]
RewriteRule .* https://%1/$0 [R=301,L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{DOCUMENT_ROOT}/public/$0 !-f
RewriteCond %{DOCUMENT_ROOT}/public/$0 !-d
RewriteRule .* /public/index.php?$0 [L,QSA]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule .* /public/$0 [L]

дефолтные правила
Router::add('^$', ['controller' => 'Main']);
Router::add('^(?P<controller>[a-z-]+)/?(?P<action>[a-z-]+)?$');

Как организовать ссылки вида:
/controller/2 вместо /controller?page=2
/controller/action/2 вместо /controller/action?page=2
Что тут нужно сделать? Никогда не делал ЧПУ раньше.
  • Вопрос задан
  • 216 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Kulaxyz
@Kulaxyz
Могу лучше
Также разбивать по слешу и проверять второй параметр. В зависимости он чисто или строка вызывать соответствующий метод.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽