PHP 路由不重定向

标签 php rest http routes

我正在尝试用 PHP 创建简单的路由器,但我不明白为什么它没有正确重定向。

所以我的设置工作方式是我有 3 条路线

  • 家乡路线“/”
  • 用户路由“/user”
  • ID 路线为“/user?id={[0-9]}”的用户

当我重定向到“/”路线时,这就是打印的内容。

/ Path / traversed

但是我希望打印此内容

/ Succesfuly navigated to / Path / traversed

但是,这对于任何其他路径都不起作用。 这是我重定向到“/user”时得到的结果

/user Not Found

这就是我想要渲染的内容。

/user Succesfuly navigated to /user Path /user traversed

这是我的 Router.php 脚本

<?php 

    class Router{

        public function get($route, $callback){

            $path = $this->getPath(); //GET PATH for ex. /users/user
            $query = $this->getQuery(); //GET QUERY for ex. ?id=15

            print($_SERVER['REQUEST_URI']);
            echo " ";

            //IF USER IS NAVIGATING TO ROUTE THAT DOESN'T EXIST PRINT "NOT FOUND"
            if($path != $route){
                $this->notFound(); 
            }

            if($path == $route){

                //IF CALLBACK IS A STRING DO SOMETHING WITH IT
                if(is_string($callback)){
                    echo "Succesfuly navigated to {$route}";
                    exit();
                }
                
                //EXECUTE CALLBACK FUNCTION
                echo call_user_func($callback);
                exit();
            }
          
        }

        //GET PATH FROM URI
        private function getPath(){
            $path = $_SERVER['REQUEST_URI'] ?? '/';
            $paramPosition = strpos($path, "?");

            if($paramPosition === false){
                return $path;
            }

            $path = substr($path, 0, $paramPosition);
            return $path;
        }

        //GET QUERY STRING ?id=15
        private function getQuery(){

            $path = $_GET;
            if(count($path) == 1){
                return $path;
            }
 
            return $path;
        }


        //404 TEXT
        private function notFound(){
            http_response_code(404);
            echo "Not Found";
            exit();
        }
    }
?>

这是我的index.php

<?php

    include_once './core/Router.php';

    $router = new Router();

    $router->get("/", function() {
        echo "Path / traversed";
    });

    $router->get("/user", function() {
        echo "Path /user traversed";
    });

    $router->get("/user?id={[0-9]}", function(){
        echo "Path /user?id={[0-9]} traversed";
    });


?>

最佳答案

这段代码有两个问题:

<强>1。 /

以外的路线的“未找到”消息

发生这种情况的原因是您在 notFound 方法中exit()。你先检查/路由,不匹配,输出“Not Found”,然后退出。

您可以做的是删除 exit() 并在找不到时从 get 返回:

//IF USER IS NAVIGATING TO ROUTE THAT DOESN'T EXIST PRINT "NOT FOUND"
if($path != $route){
    $this->notFound();
    return;
}

<强>2。 “成功导航至”未出现

发生这种情况是因为您正在检查 is_string,但是您的回调是函数,因此这个条件永远不会成立。您可以将条件更改为 is_callable:

//IF CALLBACK IS A STRING DO SOMETHING WITH IT
if(is_callable($callback)){
    echo "Succesfuly navigated to {$route}";
    exit();
}

关于PHP 路由不重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74647769/

相关文章:

javascript - express promise 链错误

rest - 在 TeamCity 中禁用构建步骤或在特定步骤开始运行的脚本

php - mysql 查询 union 和 mysql_num_rows

php - API Key PHP/MYSQL 的作用

php - 将 target=_blank 添加到外部链接

java - 带有嵌入式服务器的 JAX-RS

php - 创建 CSV 文件时,如何处理字段中的\n 和\r 字符?

c - 如何在C HTTP客户端程序中向文件写入HTTP请求

java - 如何从 Java 中的 HTTP header 中检索 IP 地址

http - IIS 7 友好 URL 重写