PHP / XML路由适用于一种路由,不适用于另一种路由

蒂里尔

当前,我试图在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

case_when 适用于一种情况,而不适用于另一种情况

来自分类Dev

2种形式使用PHP。一种用于添加,另一种用于添加更改

来自分类Dev

grep用于一种模式,但不适用于另一种模式

来自分类Dev

Android Linkify.addLinks()适用于一个textview,不适用于另一种

来自分类Dev

IPSET匹配不适用于一种Linux安装,但不适用于另一种...仅影响IPv4

来自分类Dev

为什么以下代码适用于一种模型但不适用于另一种模型?

来自分类Dev

RewriteRule适用于一种情况,但不适用于其他情况

来自分类Dev

代码适用于一种情况,但不适用于其他情况

来自分类Dev

适用于PHP,不适用于PHPUnit

来自分类Dev

适用于 PHP 但不适用于脚本

来自分类Dev

Aspectj 切入点表达式不适用于一种方法而适用于单个类中的另一种方法

来自分类Dev

PHP转换数组的另一种格式?

来自分类Dev

PHP从一种形式获取价值到另一种形式

来自分类Dev

删除节点不适用于简单XML(PHP)

来自分类Dev

PHP下载不适用于&

来自分类Dev

opendkim命令不适用于PHP

来自分类Dev

更新不适用于php mysql

来自分类Dev

条件不适用于php

来自分类Dev

PHP下载不适用于&

来自分类Dev

PHP:if语句不适用于的表单

来自分类Dev

MySQL查询不适用于PHP

来自分类Dev

PHP forloop 不适用于数组

来自分类Dev

mysqli 不适用于 php 日期

来自分类Dev

PHP Json 不适用于 jsoncallback

来自分类Dev

php 不适用于 ubuntu 18.04

来自分类Dev

ajax 不适用于 php

来自分类Dev

PHP 查询不适用于 DELETE

来自分类Dev

PHP foreach 不适用于 MySQL

来自分类Dev

ASP.NET MVC Fluent验证不适用于客户端的视图模型属性,这是另一种类型的类

Related 相关文章

热门标签

归档