Задать вопрос
@bitande
PHP

Проблема с роутером на php. Как исправить ссылки?

Роутер содержит примерно такие маршруты - затем все это разбивается и записывается в массив.
например - если перейти по адресу - news/view
запустится Контроллер News и метод View

Router::add('^(?P<controller>[a-z-]+)/(?P<action>[a-z-]+)$');


Проблема в том, что ссылки становятся вот такими

sandbox.lo/news/view/template/css/reset.css
В адрес добавляется имя контроллера и метода - news/view/, а должно быть
sandbox.lo/template/css/reset.css

причем если в конце адреса не поставить слеш / - news/view в адрес добавится только news/

из-за этого слетают все ссылки на стили и картинки в шаблоне, как это исправить?
P.S. в каком то вопросе скинули код простого роутера, поставил его, но проблема осталась.

код роутера
class Router {

    private static $routes = [];

    public static $route =[];

    private static $url = '';

    public static $params = [];

    private function setUrl() {

        self::$url = trim($_SERVER['REQUEST_URI'], '/');

        echo 'REQUEST_URi - '. self::$url;
    }

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


    public static function getRoutes()
    {
        return self::$routes;
    }

    public static function matchRoute() {

        self::setUrl();

        foreach (self::$routes as $regexp => $array) { // in array 'controller' => 'Main', 'action' => 'Index'
            if(!empty($array) && preg_match("~$regexp~i", self::$url) ) { // check if array ^ not empty and match array key(regex) with url - post.php(regex key) - post.php(url)

                self::$route['controller'] = $array['controller'];
                self::$route['action'] = $array['action'];


            } else {
                if(preg_match("~$regexp~i", self::$url, $matches)  ) { // 3 параметр - сохраняем регексы в массив

                    var_dump($matches);

                    self::$params['id'] = $matches['id'];


                    self::$route['controller'] = $matches['controller'];
                    self::$route['action'] = isset($matches['action']) ? $matches['action'] : 'Default';

                    echo 'self routes<hr>';
                    var_dump(self::$route);

                }

            }//end else
        } //end foreach

    }

    public static function dispatch() {

        Router::matchRoute();

            $controller = ucfirst(self::$route['controller']).'Controller';
            $action = 'action'.ucfirst(self::$route['action']);

echo 'final object<hr>';
        var_dump($controller);
        var_dump($action);




           if(class_exists($controller)) {
                $obj = new $controller;
            } else {
                echo 'controller not found';
            }

        if(method_exists($controller,$action)) {
            $obj->$action();
        } else {
            echo 'method not found';
        }


    }


}


Router::add('^$', ['controller' => 'News', 'action' => 'Default' ]);
Router::add('^index.php$', ['controller' => 'News', 'action' => 'Default' ]);
Router::add('^[a-z0-9-]+/[a-z-]+/[0-9]+$', ['controller' => 'News', 'action' => 'One' ]);

Router::add('^(?P<controller>[a-z-/]+)$');
Router::add('^(?P<controller>[a-z-]+)/(?P<id>[0-9]+)$'); // route for pages - page/42
  • Вопрос задан
  • 331 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@firm
Пропишите стили абсолютным путем
<link rel="stylesheet" href="/template/css/reset.css">
Ответ написан
Не очень давно задавался тем же вопросом и адекватный ответ нашёлся только один htmlbook.ru/html/base
То есть, если пути на стили и остальное относительные, то в шаблоне прописать этот тег в head и вставить путь к папке со скриптом joxi.ru/brR8Ep7uQeYzX2 . Ну или генерировать на все файлы прямые ссылки, но с base проще.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы