0

我正在使用 MVC 结构创建一个网站。下面是我用来使用干净 URL 并加载适当文件的代码。但是它只适用于第一级。

说我想参观mywebsite.com/admin它会起作用,但mywebsite.com/admin/dashboard不会。问题出在数组中,如何让数组在第二级和第二级之后加载内容。

最好创建一个这样的数组吗?

Array
     - controller
     - view
          - dashboard

这里的任何帮助都会很棒。也作为一个附带问题。设置“自定义”网址的最佳方式是什么。因此,如果我要放入mywebsite.com/announcement它会检查它是否有控制器,如果失败,请检查它是否有自定义内容(可能是“customs”文件夹中的同名文件,然后如果没有,则执行 404页面未找到的东西)虽然这不是一个优先问题,但与代码的工作方式松散相关,所以我认为最好添加。

function hook() {
    $params = parse_params();
    $url = $_SERVER['REQUEST_URI'];
    $url = str_replace('?'.$_SERVER['QUERY_STRING'], '', $url);

    $urlArray = array();
    $urlArray = explode("/",$url);
    var_dump($urlArray);
    if (isset($urlArray[2]) & !empty($urlArray[2])) {
        $route['controller'] = $urlArray[2];
    } else {
        $route['controller'] = 'front'; // Default Action
    }
    if (isset($urlArray[3]) & !empty($urlArray[3])) {
        $route['view'] = $urlArray[3];
    } else {
        $route['view'] = 'index'; // Default Action
    }
    include(CONTROLLER_PATH.$route['controller'].'.php');
    include(VIEW_PATH.$route['controller'].DS.$route['view'].'.php');
    var_dump($route['controller']);
    var_dump($route['view']);
    var_dump($urlArray);
    var_dump($params);

    // reseting messages
    $_SESSION['flash']['notice'] = '';
    $_SESSION['flash']['warning'] = '';
}
// Return form array
function parse_params() {
    $params = array();
    if(!empty($_POST)) {
        $params = array_merge($params, $_POST);
    }
    if(!empty($_GET)) {
        $params = array_merge($params, $_GET);
    }
    return $params;
}
4

3 回答 3

1

你能澄清一下吗:“问题出在数组中,我怎样才能让数组在第二级和第二级之后加载内容。”

我不明白你想让这个东西如何工作。我检查了你的代码,它可以工作。也许你只需要用2$urlArray[1]代替$urlArray[2]3 代替?数组中的第一个元素位于索引 0 处。

通常它是这样完成的:

网址格式:

/controller/action/param1/param2/...

-controller- should be a class. That class has a method/function called -action-.

ex. /shoes/show/121/   --> this will load controller shoes 
                           and execute the method/function show(121)
                           that will show the shoes that have the id 121 in the
                           database.

ex. /shoes/list/sport  --> this will load controller shoes
                           and execute function list('sport') that will list all
                           shoes in the sport category.

如您所见,您只加载一个控制器,并且从该控制器只运行一个函数,该函数将获取路径的其余部分并将其用作参数。

如果您想为一个 URL 设置多个控制器,则必须从主控制器加载其余控制器。大多数 MVC(如 CodeIgniter)每个 URL 只加载一个控制器。

第二个问题:

漂亮网址的最佳方法是将它们保存在数据库中。这意味着您可以拥有这样的 URL:

/I-can-write-anything-here-No-need-to-add-ids-or-controller-names

然后您获取此 URL 并在 db 中搜索它并获取此 URL 所需的 -controller- 和 -action-。

但我还没有看到流行的 MVC 框架做到这一点。我猜原因是数据库会收到大量文本匹配查询,这会减慢速度。

流行的 MVC 框架使用:

/controller/action/param1/param2

这样做的好处是您可以直接从 url 中找到控制器/操作。缺点是您将获得如下网址:

/shoes/list/sport 
//when what you really want is
/shoes/sport 
//or just
/sport //if the website only sells shoes

这可以通过重定向/shoes/sport/shoes/list/sport

如果您制作自己的 MVC,那么您应该使用 OOP,因为如果不这样做,事情会很快变得丑陋:所有操作/函数都在同一个命名空间中。

于 2012-07-08T13:30:51.400 回答
0

就个人而言,我建议您使用现有的众多 PHP 框架之一,因为它会为您处理路由并让您专注于编写应用程序。CakePHP 是我使用过一段时间的一个,它让我的生活变得如此轻松。

于 2012-07-08T11:57:37.493 回答
0

我做什么:

我创建了一个 .htaccess 文件,它将像 www.example.com/url/path/or/something 这样的 URL 重定向到 www.example.com/index.php?url=url/path/or/something,所以它会很漂亮很容易在你的 $_GET['url'] 上做一个爆炸第二,它更好,因为用户输入的所有内容都将被重定向到你的 index.php,所以你可以完全控制一切。

如果你愿意,我可以将我的 mvc (bitbucket) 的 url 给你,这样你就可以看看我是如何做到的;)

(对不起其他人,但我不喜欢将网址公开发布到我的网站)

编辑:为了更准确地回答您的特定问题;它将解决您的问题,因为一切都转到 index.php 并且您可以完全控制请求的 url。

于 2012-07-08T11:58:07.943 回答