Задать вопрос

Как правильно осуществить построение маршрутизации PHP?

Здравствуйте,

Я как вы поняли с заглавия только недавно начал изучать программирование и мне очень важно понять, как писать проекты с нуля, и в процессе написания набираться опыта.
Но я подошел к вопросу о маршрутизации и застрял. У меня не было опыта написания сайтов даже без ЧПУ.

Подскажите, пожалуйста, на счет вот этих моментов:
1. Я пробовал написать маршрутизатор в таком плане
<?php

namespace library;


class Router {


    function __construct(){
        $uri = $_SERVER['REQUEST_URI'];

        $uri = trim($uri,'/');
        $uri = explode('/',$uri);
        print_r($_GET);
        echo $_GET[0];
        echo '<br>';

        if($uri[0] == ""){
            $path = '\controller\IndexController';
            $controller = new $path();
            $method = 'dispatch';
            $controller->$method();
        }else{
            $path = '\controller\IndexController';
            $controller = new $path();
            $method = 'dispatch';
            if(!method_exists($controller,$method)){

            }
            $controller->$method();
        }
    }
    public function getController(){

    }
}


Но я вижу что как правило все берут адрес не с REQUEST_URI, а с $_GET. Здесь есть этому причина, или же разницы нету.

2. Я просто вытаскивал с УРЛ контроллер и действие банальным присвоение $uri[0], $uri[1], а в фреймворках идет определения с помощью правил и регулярных выражений. Что это дает?

Возможно есть где-то что-то почитать для таких как я, кому нужно понять работу этих элементарных вещей?

Заранее всем спасибо!
  • Вопрос задан
  • 2824 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Посмотрите на тот вариант, который предоставляется в Symfony/Routing (не столько реализация, сколько вообще как определяются рауты) и попробуйте реализовать по схожему принципу.

По сути, все сводится к формированию регулярного выражения из правила. Например правило вида
route="/blog/{id}" requirements={id: '\d+'}
где route - это шаблон нашего урла, а requirements - валидация параметров (опционально)
сгенерит регулярку вида:
^/blog/(?P<id>\d+)$
где (?P<id>\d+) именованный подшаблон (можно сделать и проще, но так удобнее). С версии 5,2+ могут быть такие варианты:
(?P<id>\d+)
(?<id>\d+)
(?'id'\d+)


Далее ваш маршрутизатор при проверке соответствий с маршрутами просто проходит по массиву правил (по сути массиву регулярок) и смотрит соответствует ли оно какому-либо правилу.

На самом деле в целях обучения, это самый классный способ. Ибо там есть где подумать и над формированием новой строки, и с регулярками разобраться можно неслабо... Последнее поможет вам не только в PHP, но и в JS (немного), и просто в жизни (кучи IDE и редакторов имеют поиск и замену по регуляркам, что иногда очень полезно).

Схожая реализация в Yii, и в большинстве других фреймворков.
Ответ написан
@Facetrollex
Возможно есть где-то что-то почитать для таких как я, кому нужно понять работу этих элементарных вещей?

Посмотри как реализован роутинг в популярных фреймворках (Symphony, Zend, Yii & etc).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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