php - 在 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');
?>
解决方案
这对于stackoverflow问题来说有点宽泛,但我认为您需要做的是让您的路由器注册所有可能的路由,并且只在最后实际尝试运行它们:
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);