Я работаю над простым роутером для практики php, он уже немного усовершенствован, но я публикую более упрощенную версию.
Мой класс маршрутизатора проверяет заданный URL-адрес относительно текущего пути к серверу и возвращает содержимое, если они совпадают. Это работает нормально, но проблема в том, что маршрутизатор работает 3 раза, потому что я вызываю метод get () маршрутизатора 3 раза в моем файле rout.php.
Если я, например, хочу вернуть ошибку 404, когда маршрут не совпадает, он вернет ее 3 раза. 1 раз для каждого маршрута не найдено. Каков наилучший способ исправить это?
Как всегда, ваша помощь очень ценится.
Класс маршрутизатора:
<?php
class Router {
public $currentRoute = '/';
public function __construct()
{
$this->getCurrentRoute();
}
public function getCurrentRoute()
{
if(isset($_SERVER['PATH_INFO'])) {
$this->currentRoute = $_SERVER['PATH_INFO'];
}
}
public function get($route, $content)
{
if($route == $this->currentRoute) {
echo $content();
}
}
}
Файл маршрутов:
<?php
$router->get('/', function()
{
return 'Index page';
});
$router->get('movies', function()
{
return Cinematix\View::make('movies');
});
$router->get('users', function()
{
return 'The users collection page';
});
Сначала предупредите, что ваш подход не рекомендуется. Глядя на классику Шаблон программирования MVC хороший способ начать.
Читайте дальше, если вы действительно хотите сделать это так, как вы начали использовать анонимные обратные вызовы.
Класс маршрутизатора:
class Router {
public $currentRoute = '/';
private $routes;
public function __construct($routes)
{
$this->routes = $routes;
$this->getCurrentRoute();
}
public function getCurrentRoute()
{
if(isset($_SERVER['PATH_INFO'])) {
$this->currentRoute = $_SERVER['PATH_INFO'];
}
}
public function route()
{
$route = $this->currentRoute;
if (!isset($this->routes[$route])) {
$route = '/404';
}
if (is_callable($this->routes[$route]))
{
echo $this->routes[$route]();
}
}
}
файл маршрутов:
$routes = array(
'/' => function()
{
return 'Index page';
},
'/movies' => function()
{
return 'Movies';
},
'/users' => function()
{
return 'The users collection page';
},
'/404' => function()
{
return '404';
}
);
$router = new Router($routes);
$router->route();
Простым решением может быть объявление статического флага в вашем классе. Сказать
<?php
class Router {
static $found = 0;
public $currentRoute = '/';
Затем в маршрутах.
$router->get('/', function()
{
Router::$found = 1;
return 'Index page';
});
$router->get('movies', function()
{
Router::$found = 1;
return Cinematix\View::make('movies');
});
$router->get('users', function()
{
Router::$found = 1;
return 'The users collection page';
});
if (!Router::$found) {
$router->get('404', function()
{
return '404 page';
});
}
Теперь «404» должен быть объявленным «путем» в классе Router.