我正在尝试用 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/