@kicker77_95

Как сделать роутинг с динамической uri?

Чистый PHP, никаких фреймворков, проект пишу для собственного удовольствия и учебы. Хочу сделать динамическую URI на манер фреймворков, например, при подтверждении аккаунта сделать общую страницу подтверждения для разных хэшей (надеюсь понятно объяснил). За ограничитель динамической части URI я решил взять символы { }.
Сразу оговорюсь, роутинг без этой хрени, рабочий.
<?php
namespace App\Router;

class Route
{
    private $uri;
    private $callable;

    public function __construct($uri, $callable)
    {
        $match = '';

        preg_match('#%7B(.+)%7D#', $uri, $match);

        if (!empty($match)) {
            $this->uri = preg_replace('#%7B(.+)%7D#', $match[1], $uri);
        } else {
            $this->uri = $uri;
        }
        
        $this->callable = $callable;
    }
}

Класс проверки Роутов:
<?php
namespace App\Router;

class Router
{
    public function checkRoute($routes)
    {
        foreach ($routes as $elem) {
            if ($elem->uri == $_SERVER['REQUEST_URI']) {
                return call_user_func($elem->callable);
            }
        }
    }
}

Например, роут выглядит вот так: Route('/index/df/{sometext}', [RegistrationController::class, 'testfunction']).

Ничего не работает. Я попросту не могу понять принцип, как объяснить роутеру, какая часть будет динамичная. Я пишу регулярку, она вроде рабочая, но сама по себе она не несет практической пользы, потому что она просто удаляет символы {}. Помогите, пожалуйста. Хочу сам разобраться с роутерами и прочим, чтобы в дальнейшем примерно понимать, что и как работает а не тупо заучивать фреймворки
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 1
php666
@php666
PHP-макака
Я попросту не могу понять принцип, как объяснить роутеру, какая часть будет динамичная.

$routes = [
    ['~/user/([0-9]+)/?~', ['id'], UserController::class, 'showUser'],
    // ...
];

дальше, имея представление о функции preg_match и управляющих конструкциях языка, сам додумаешься?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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