Hej, postanowilem spróbować swoich sił i piszę prosty router. Czy ktoś mógłbym mi podpowiedzieć czy to zmierza w dobrą stronę? Zwłaszcza użycie destruktora w taki sposób?
Od razu wyjaśniam dlaczego tak go używam, ponieważ funkcja checkRoute użyta w innym miejscu np bezpośrednio w metodzie __call uruchamiała mi się tyle razy ile miałem odwołań do niej co za tym idzie, słowo ">home<" po wejściu na strone /home wyświetliło mi się aż 3 razy. Natomiast kiedy trasa sprawdzana jest już na sam koniec, zaraz przed zakończeniem pracy obiketu wtedy wszystkie zebrane dane brane są pod uwage RAZ.
Ewentualnie jeszcze mogę użyć checkRoute zaraz pod odwołaniami do ->get jednakże wymyśliłem sobie aby Router opierał się tylko na jednej metodzie wyjściowej, gdzie podajemy trasę oraz to co ma robić (w tym momencie jest to tylko metoda anonimowa))
<?php
$router = new Router();
$router->get('home', function(){
echo ">home<";
});
$router->get('home/list', function(){
echo ">home list<";
});
$router->get('pomoc', function(){
echo ">pomoc<";
});
?>
Klasa Router
<?php
class Router
{
private $routes = [];
private $request_uri;
private $supportedRouteMethods = ['GET', 'POST'];
public function checkRoute(){
$this->request_uri = ltrim($_SERVER['REQUEST_URI'], '/');
if(array_key_exists($this->request_uri, $this->routes)){
$run = $this->routes[$this->request_uri];
if(is_callable($run)){
$run();
}
}else{
echo "404";
return true;
}
}
public function addRoute($path, $functionToRun){
$this->routes[$path] = $functionToRun;
}
public function __call($name, $args){
if(!in_array(strtoupper($name), $this->supportedRouteMethods)){
echo 'BAD ROUTE METHOD';
return false;
}
$this->addRoute($args[0], $args[1]);
}
public function __destruct()
{
$this->checkRoute();
}
}