【问题标题】:Simple PHP Routing Project简单的 PHP 路由项目
【发布时间】:2013-02-23 18:24:54
【问题描述】:

我需要创建一个简单的路由机制,它接受如下请求: /foo/bar 并将其转换为 FooController->barAction();我必须使用单个脚本作为访问点来加载这些控制器类和操作方法。我也不能使用任何外部框架或库来完成这项任务。这需要能够在带有 Apache 的 PHP 5.3 服务器上运行。

以下是我已经写过的内容,但我无法让它工作:

class Router {

    private static $routes = array();

    private function __construct() {}
    private function __clone() {}

    public static function route($pattern, $callback) {
        $pattern = '/' . str_replace('/', '\/', $pattern) . '/';
        self::$routes[$pattern] = $callback;
    }

    public static function execute() {
        $url = $_SERVER['REQUEST_URI'];
        $base = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));
        if (strpos($url, $base) === 0) {
            $url = substr($url, strlen($base));
        }
        foreach (self::$routes as $pattern => $callback) {
            if (preg_match($pattern, $url, $params)) {
                array_shift($params);
                return call_user_func_array($callback, array_values($params));
            }
        }
    }
}

我正在尝试至少执行基于另一个简单路由器的当前脚本,但我实际上无法使用

Router::route('blog/(\w+)/(\d+)', function($category, $id){
  print $category . ':' . $id;
});
Router::execute();

【问题讨论】:

  • 你给了我们一长串需求清单和一堵代码墙,但忘了问一个问题。
  • 我会看看现有的项目。随机示例:github.com/deceze/Kunststube-Router
  • "我也不能使用任何外部框架或库来完成这项任务。"但没有人禁止你查看他们的源代码。使用库不仅仅是将黑盒塞进应用程序。代码分析使程序员成为一名优秀的程序员。
  • 我只需要有人来查看我的代码并就下一步做什么提供一些指导。我知道如何使用 .htaccess 进行标准 URL 重写,但我需要能够将 URI 请求转换为 FooController->barAction();
  • 我刚刚更新了我正在使用的至少执行类的内容(它基于另一个简单的路由器,但我实际上无法获得输出或我想要的结果。

标签: php url-routing


【解决方案1】:

而不是试图打破 PATH。为什么不改用 .htaccess。

因此,您可以拥有如下所示的内部 URL:

index.php?module=MODULE&action=INDEX

然后使用 .htaccess 提供 URL 中的路径并相应地路由它们。

www.mydomain.com/MODULE/INDEX

这篇文章可以帮助改写regex for creating pritty urls in htaccess

可能有更好的,只是一个快速的谷歌搜索。

这样你就可以这样访问了:

$module = $_GET['module'];
$action = $_GET['action];

然后您可以对路由器中的相应操作进行检查以检查它是否存在,然后相应地重新路由。

【讨论】:

  • 我不确定如何将 URI 请求转换为 FooController->barAction();。通常我只会使用带有 .htaccess 的正则表达式来制作漂亮的 URL 或进行重定向。
  • 这个解决方案不是很灵活。 IE。如果你想在某个时候拥有更深的 URL 怎么办。或者您出于任何原因(例如深度链接)想要打破上述约定?
  • @PeeHaa 你添加了更多,这只是让他思考他的解决方案的一个例子,让它更容易而不依赖于使用正则表达式解析路径。这就是大多数框架的做法......
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2015-12-14
相关资源
最近更新 更多