Your Location is: Home > Php

Add 404 rule into PHP class router

From: Tunisia View: 1238 Sebas 

Question

I have a simple PHP router but I missed a rule if de file not exists. What I think is I must declare all files to check if the file exist?

But this raises another question how to check if the endpoint is empty or not exist and if this is empty show the 404 file also. Below the code what I have so far.

Router.php

<?php
class Router{

    private $request;
    
    public function __construct($request){
    
        $this->request = $request;
        
    }
    
    public function get($route, $file){
    
        $uri = trim( $this->request, "/");
        
        $uri = explode("/", $uri);
    
        if($uri[0] == trim($route, "/")){
        
            array_shift($uri);
            $args = $uri;
        
            require $file . '.php';
            
        }
    }
}
?>

index.php

<?php
include 'Router.php';

$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);

$router->get('/', 'app/home');
$router->get('post', 'app/post');

?>

Best answer

This is a bit broad for a stackoverflow question but I think what you need to do is have your router register all the possible routes, and only actually try to run them at the end:

class Router {
    private $routes = [];

    public function get($route, $file) {
        if (file_exists($file . '.php')) {
            $this->routes[$route] = $file;
        }
    }

    public function run($request) {
        $uri = trim( $request, "/");
        
        $uri = explode("/", $uri);
        if (!empty($uri[0]) && !empty($this->routes[$uri[0]])) {
            $args = $uri;
            require $this->routes[$uri[0]] . '.php';
            return;
        }
        require '404.php';
    }
}

Note that in get() the route is only defined if the given file exists.

then when declaring your routes:

<?php
include 'Router.php';

$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);

$router->get('/', 'app/home');
$router->get('post', 'app/post');

$router->run($request);