PHP: класс простой маршрутизации, вопрос, как добавить несколько маршрутов - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь работать с простым классом Router (изучая основы до фреймворка, но я думаю, что что-то не так с примером маршрутизатора, который я использовал. Ниже приведен очень маленький класс маршрутизатора, который я получил от коллеги и попытался интегрировать это в моем коде, чтобы заменить предыдущее использование, где я только что использовал echo раньше (закомментировал часть кода). loginController showLoggedInUser () и registerController index () просто используются для визуализации html шаблона.

Обе функции $ router-> add () будут работать, если я использую его только для добавления одного маршрута, однако мой маршрутизатор не сохраняет несколько маршрутов в массиве, потому что кажется, что каждый маршрут будет сохранен под ключом '/' и в случае, если я предоставить несколько маршрутов, кажется, мои предыдущие маршруты просто перезаписаны. Поэтому я думаю, мне нужно будет настроить класс маршрутизатора. Как я могу это исправить?

PHP 7.4 используется

Маршрутизатор. php

<?php
declare(strict_types=1);

class Router
{
    private array $route;

    public function add(string $url, callable $method): void
    {
        $this->route[$url] = $method;
    }

    public function run()
    {

        $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        if(!array_key_exists($path, $this->route))

        {
            exit();
        }
        return call_user_func($this->route[$path]);
    }
}

index. php

<?php
declare(strict_types=1);

require __DIR__ . '/../vendor/autoload.php';

session_start();

$router = new Router();

$mysqliConnection = new MysqliConnection();
$session = new SessionService();

$loginController = new Login($mysqliConnection);
$router->add('/', [$loginController, 'showLoggedInUser']);
//echo $loginController->showLoggedInUser();


$registerController = new Register($mysqliConnection);
$router->add('/', [$registerController, 'index']);
//echo $registerController->index();


echo $router->run();

1 Ответ

1 голос
/ 29 марта 2020

Не уверен в общем принципе наличия двух маршрутов с одинаковым именем, но вы могли бы добиться этого, используя список вызываемых объектов для каждого маршрута.

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

class Router
{
    private array $route;

    public function add(string $url, callable $method): void
    {
        $this->route[$url][] = $method;
    }

    public function run()
    {

        $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        if(!array_key_exists($path, $this->route))

        {
            exit();
        }
        foreach ( $this->route[$path] as $paths )   {
            $paths();
        }
        // Not sure what to return in this case.
        // return call_user_func($this->route[$path]);
    }
}

$router = new Router();

// $mysqliConnection = new MysqliConnection();
// $session = new SessionService();

// $loginController = new Login($mysqliConnection);
$router->add('/', function () { echo "login"; } );


// $registerController = new Register($mysqliConnection);
$router->add('/', function () { echo "Register"; });


echo $router->run();

Я бы рекомендовал иметь отдельные URL, /login и /register, чтобы их можно было вызывать отдельно.

...