PHP MVC. Как получить GET запросы
Сайт должен при нажатии на кнопку открывать книгу с определенным id. Таких книг может быть сотни. Каким образом я могу вывести их если каждый путь мне придется прописывать в routes.php. Хочу получить один из таких результатов: bookshop/books/25 либо bookshop/books?id=25. Класс Router.php по своей логике делает редирект на главную страницу, т.к эти пути не прописаны в routes.php. Даже если я уберу редирект из-за неправильного пути, то мне всё равно придётся прописывать каждый айдишник в routes. Это бессмысленно по понятным причинам. Как мне нужно дописать Router.php чтобы все заработало?
Router.php
class Router
{
protected $routes = [];
protected $params = [];
function __construct() {
$arr = require 'application/config/routes.php';
foreach ($arr as $key => $val) {
$this->add($key, $val);
}
}
public function add($route, $params) : void {
$route = '#^' . $route . '$#';
$this->routes[$route] = $params;
}
public function match() : bool {
$url = trim($_SERVER['REQUEST_URI'], '/');
foreach ($this->routes as $route => $params) {
if(preg_match($route, $url, $matches)) {
$this->params = $params;
return true;
}
}
return false;
}
public function run() : void {
if($this->match()) {
$path = 'application\controllers\\' . ucfirst($this->params['controller']) . 'Controller';
if(class_exists($path)) {
$action = $this->params['action'] . 'Action';
if(method_exists($path, $action)) {
$controller = new $path($this->params);
$controller->$action();
} else { View::errorCode(404); }
} else {View::errorCode(404); }
} else { View::redirectToMain(); }
}
}
routes.php (Разрешенные пути)
<?php
return [
'main' => [
'controller' => 'main',
'action' => 'index'
],
'' => [
'controller' => 'main',
'action' => 'index'
],
'login' => [
'controller' => 'account',
'action' => 'login'
],
'signup' => [
'controller' => 'account',
'action' => 'signup'
],
'admin' => [
'controller' => 'adm',
'action' => 'adminpanel'
]
];