首页 > 解决方案 > 在 PHP 类路由器中添加 404 规则

问题描述

我有一个简单的 PHP 路由器,但如果 de 文件不存在,我错过了一条规则。我认为我必须声明所有文件以检查文件是否存在?

但这引发了另一个问题,如何检查端点是否为空或不存在,如果为空,还显示 404 文件。在代码下面我到目前为止。

路由器.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';
            
        }
    }
}
?>

索引.php

<?php
include 'Router.php';

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

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

?>

标签: phpclasshttp-status-code-404router

解决方案


这对于s​​tackoverflow问题来说有点宽泛,但我认为您需要做的是让您的路由器注册所有可能的路由,并且只在最后实际尝试运行它们:

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';
    }
}

请注意,在 get() 中,仅当给定文件存在时才定义路由。

然后在声明您的路线时:

<?php
include 'Router.php';

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

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

$router->run($request);


推荐阅读