【问题标题】:PHP MVC - Database routing?PHP MVC - 数据库路由?
【发布时间】:2015-08-24 19:00:26
【问题描述】:

您好,我目前正在玩 PHP MVC 编程,想知道是否有人使用数据库进行了某种“路由”?

我有一个如下所示的“页面”表:http://i.imgur.com/xS1OvjW.png

目前所有的路线都是硬编码的,我想一定可以用数据库来做..

但我不仅要获取页面并显示它,还需要能够使用它发送参数。

示例: 如我的页表所示,我有一个“测试”网址。如果我输入http://demo.com/test/ 我会“重新路由”以使用“home”控制器和“Index”方法。但我还需要能够输入 http://demo.com/test/id/40 并且 id/40 将作为参数发送到控制器/方法。

如果这不是一件好事,或者如果有人有更好的解决方案,请告诉我! :)

问候, 弗雷德里克

【问题讨论】:

  • 这样的事情通常在较低级别完成,同时在 http 服务器内部重写传入请求。所以在调用php之前。对于重写步骤,有基于数据库的解决方案。但这一切都是值得怀疑的。由于无论如何都必须对所有控制器和动作进行编码,并且调用签名无论如何都必须与动作签名匹配,因此这种方法通常没有什么优势。为什么要以这种动态方式更改路由?诸如“测试”和“内部”之类的东西是典型的临时示例。但是这些可以很容易地通过临时重写规则来实现。
  • 我不会围绕任何数据库构建 MVC 框架。相反,使用 Laravel 之类的框架并创建解析 URL 并加载相关文件/控制器/视图/任何内容的代码。您仍然可以使用数据库来保存您的路线,但它将与框架分离。

标签: php model-view-controller routing


【解决方案1】:

这绝对取决于您使用的服务器,但由于您是 PHP MVC 菜鸟,我将在此示例中引用 apache,并希望您在示例中使用它。

首先,您需要将您的网络服务器配置为知道它必须通过您的基本页面(通常是 index.php)发送所有流量。现在该页面将执行一些其他操作(调用引导程序等),但为了论证,我们会说它立即执行的所有操作就是查看来自页面的请求,将其与数据库进行比较,并在以下情况下完成请求它可以。

在这种情况下,将来自服务器的请求信息传递到 index.php 页面会很有帮助。为此,您需要使用类似于以下内容的 .htaccess 文件配置 apache:

DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ public/?path=$1 [L,QSA]

这告诉它对所有不是特定文件或目录的请求使用 index.php,并将完整的 url 路径作为 $_GET var 传递给 index.php。

接下来,在 index.php 中,您需要对照路径数据库检查传递的路径。这是一个非常简单的示例:

<?php

// Obviously use your database and some string parsing here to match correctly
// I generally explode the path on '/' to break it into controller, action, etc.

if ($_GET['path'] == "user/account") {

    // Then you call the controller that matches the first part of the route
    // The action that matches the second part of your route
    // And pass the request along so you can access anything else

    call UserController::accountAction($_REQUEST);

} else if ($_GET['path'] == "user/resetpassword") {

    call UserController::resetPasswordAction($_REQUEST);

}

从那里开始,您应该在正确的地方并拥有所需的一切。 Controller/Action URL 格式是一种相当常见的格式,它让我们可以轻松地做到这一点。

希望答案有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多