0

更新

当我去 时/about/,我得到:

Route: contact
Get Param: about

当我去 时/contact/,我得到:

Route: about
Get Param: contact


这是我的代码:

foreach ($routes as $route) {
            if (preg_match('/^' . $route . '$/', $uri)) {
                $controller = 'controllers/' . $route . '.php';

                if (file_exists($controller)) {
                    include_once($controller);
                } else {
                    echo '<h1>404 - Missing Controller</h1>';
                }
            } else {
                echo '<h1>404 - Missing Route</h1>';
            }
}

问题是,我总是看到“Missing Route”……我的问题是什么?

如果我替换为,我会遇到同样的preg_match问题if ($uri == $route)

$路线 = Array ( [0] => about [1] => contact )
$uri =contact

目录结构:

控制器/
      About.php
      Contact.php
Router.php

谢谢你的帮助!

4

2 回答 2

1

你为什么要使用 preg_match 呢?

if (preg_match('/^' . $route . '$/', $uri))

是相同的

if ($route == $uri)

除非出于某种原因,您希望在其中$route包含正则表达式元字符。

此外,您的输出显示您有 404,但您实际上返回的是 404 的 HTTP 响应吗?

于 2012-12-28T21:16:24.913 回答
1

除了匹配的索引之外,您的 else 条件正在执行每个索引。

我认为你需要做的是:

if(in_array($uri, $routes) {
            $controller = 'controllers/' . $uri . '.php';
            if (file_exists($controller)) {
                include_once($controller);
            } else {
                echo '<h1>404 - Missing Controller</h1>';
            }
 } 
 else {
            echo '<h1>404 - Missing Route</h1>';
      }

此外,如果您的控制器名称以大写字母开头,您需要在 $controller 变量中添加一些逻辑,使其首字母大写。

于 2012-12-28T21:25:47.573 回答