我正在try 用PHP创建简单的路由,但我不明白为什么它不能正确地重定向.

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

  • 回家路由"/"
  • 用户路径"/USER"
  • ID为"/USER?ID={[0-9]}"的用户

当我重定向到"/"ROUTE时,这是打印的内容.

/ 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. "Not found" messages for routes other than 100

之所以会发生这种情况,是因为您使用的是notFound方法.您首先判断/ROUTE,它不匹配,输出"Not Found",然后退出.

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

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

2. "Successfully navigated to" not appearing

发生这种情况是因为您正在判断is_string,但是您的回调是函数,因此此条件永远不会为真.您可以将条件更改为is_callable:

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

Php相关问答推荐

Symfony/Panther Web抓取不适用于登录后的内容(云功能)

如何更改数据表行背景 colored颜色

在AJAX请求后,Laravel重定向.(不允许使用方法)

将文件添加到存档,而不重建存档

上传WordPress模板中的翻译文件(.mo和.po)

SFTP在PHP(phpseclib3\Net\SFTP)-过滤目录列表结果服务器端可能吗?类似于psftp中的LS命令?

限制联系人页面仅允许在WooCommerce中登录的用户

如何从phpseclib和SFTP获取日志(log)记录?

用ajax获取文件 - CORS问题&;设置缓存?

既然setSQLLogger()已被弃用,如何使用中间件在 Doctrine 3 中记录查询执行时间?

使用 PHP,我可以将 foreach 语句放入瞬态中吗?

woocommerce_available_ payment_gateways 过滤器挂钩多次触发

如何在 PHP laravel 中将图像的透明背景转换为白色?

如何在 Laravel 迁移中使用日期时间和天数?

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

WooCommerce单个产品页面上启用额外选项卡的产品元框字段

Laravel使用另一张表进行关联查询

Xdebug 不会在断点处停止

如何在 WooCommerce 中显示每个自定义选项卡的内容

路由未定义的 laravel 导出