当前,我试图在OOP-PHP中编写一个简单的博客cms,但遇到了一些麻烦。为了使用户进入适当的页面,我制作了一个简单的路由器,通过一个简单的preg_match来检查请求的uri与xml路由文件。这是代码:
在我的引导文件中:
$uri = $_SERVER['REQUEST_URI'];
$router = new Router($manager, $uri);
$content = $router->route();
在我的路由器文件中:
public function route()
{
$uri = $this->uri;
foreach ($this->routes as $route) {
if (preg_match('#^'.$route->getUri().'$#', $uri, $matches)) {
if (!empty($route->getParams())) {
$route->setVars($matches[1]);
}
$controllerClass = '\Controller\\'.$route->getController();
$controller = new $controllerClass($this->manager);
$action = $route->getAction().'Action';
if (!empty($route->getVars())) {
$content = $controller->$action($route->getVars());
} else {
$content = $controller->$action();
}
return $content;
} else {
return $content = header('Location: View/404.php');
}
}
}
在我的路由xml文件中:
<?xml version="1.0" encoding="utf-8"?>
<routes>
<route uri="/([0-9]*)" params="page" controller="BlogController" action="index" />
<route uri="/post-([0-9]+)" params="id" controller="BlogController" action="view" />
</routes>
问题:即使我有分页系统,路由也可以很好地用于索引操作,但不能用于单个帖子查看。Preg_Match似乎可以很好地适应索引路由,并且如果带括号,则可以重定向到正确的页面,但是当我尝试查看单个帖子时,我会在404错误页面上被重定向。
作为参考,索引模板文件,因此您可以看到正确的链接:
public function display($page)
{
$display = '<h1>Liste des articles présentés sur ce blog:</h1><br />';
$posts = $this->posts;
$pages = $this->pages;
foreach ($posts as $post) {
if (strlen($post->getContent()) > 200) {
$debut = substr($post->getContent(), 0, 200);
$debut = substr($debut, 0, strrpos($debut, ' ')).'...';
$post->setContent($debut);
}
if ($post->getNbComment() == 0 || $post->getNbComment() == null) {
$comments = 'Aucun commentaire. ';
} else if ($post->getNbComment() == 1) {
$comments = 'Un commentaire. ';
} else {
$comments = $post->getNbComment().' commentaires. ';
}
$display .=
'<div class="row">
<h3 class="col-sm-8"><a href="/post-'.$post->getId().'">'.htmlspecialchars($post->getTitle()).'</a></h3>
<div class="col-sm-12">'.nl2br(htmlspecialchars($post->getContent())).'</div>
<p class="col-sm-offset-8 col-sm-4"><em>Par '.htmlspecialchars($post->getAuthor()).' le '.$post->getDate()->format('d-m-Y').'.</em> '.$comments.'</p>
</div>';
}
$display .= '<div class="btn-group" role="button">';
for ($i=1; $i <= $pages; $i++) {
$display .= '<a href="/'.$i.'" ';
if ($i == $page) {
$display .= 'class="btn btn-primary">'.$i.'</a>';
} else {
$display .= 'class="btn btn-default">'.$i.'</a>';
}
}
$display .= '</div>';
return $display;
}
我目前迷路了,连我的橡皮鸭都无法帮助我。不用说,我检查了是否有人问过同样的问题,却找不到。
谢谢您的宝贵时间,如果我有任何错误,请原谅我的英语。
编辑:
如第一个答案中所述,这是$this->routes
路由器文件中的var_dump 。如您所见,这两个路由都在路由器文件和xml文件中正确定义。
array (size=2)
0 =>
object(Lib\Route)[13]
private 'uri' => string '/([0-9]*)' (length=9)
private 'params' => string 'page' (length=4)
private 'controller' => string 'BlogController' (length=14)
private 'action' => string 'index' (length=5)
private 'vars' => null
1 =>
object(Lib\Route)[11]
private 'uri' => string '/post-([0-9]+)' (length=14)
private 'params' => string 'id' (length=2)
private 'controller' => string 'BlogController' (length=14)
private 'action' => string 'view' (length=4)
private 'vars' => null
再次感谢。
我认为这里唯一的问题是route()
函数循环中的退出条件。您正在遍历所有路由,但是实际上,您仅在评估了第一条路由后才从该函数返回。
您无需处理任何else
情况,仅在找不到路由时才重定向到404页面。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句