php – MVC路由如何工作?

所以我开始学习MVC(真正的MVC,而不是框架MVC)更深入,我正在尝试开发一个小框架.我正在阅读其他框架,如Symphony和Zend,看看他们的工作,并尝试自己实现.

我被卡住的地方是URL路由系统:

<?php
namespace Application\Common;

class RouteBuilder {

    public function create($name, $parameters) {
        $route           = new Route($name);
        $route->resource = array_keys($parameters)[0];
        $route->defaults = $parameters["defaults"];
        $notation        = $parameters["notation"];
        $notation = preg_replace("/\[(.*)\]/", "(:?$1)?", $notation);
        foreach ($parameters["conditions"] as $param => $condition) {
            $notation = \str_replace($param, $condition, $notation);
        }

        $notation = preg_replace("/:([a-z]+)/i", "(?P<$1>[^/.,;?\n]+)", $notation);

        //@TODO: Continue pattern replacement!!
    }
}
/* How a single entry looks like
 * "main": {
    "notation": "/:action",
    "defaults": {
        "resource"  :   "Authentication",
    },
    "conditions":   {
        ":action"   :   "(login)|(register)"
    }
},

 */

我只是不能把我的头包裹好了.这里的应用程序工作流程是什么?

该模式是生成的,可能是一个Route对象要保存在Request对象下面的东西,那么什么?它是如何工作的?

P.S. Looking for a real, well explained answer here. I really want to understand the subject. I would appreciate if someone took the time to write a real elaborate answer.

路由类(或调度器,有些人称之为)只需将请求的URL路由到指定的控制器/操作.

所以一般的请求都是这样的:

http://localhost/news/economics/param1/param2

没有使用mod_rewrite,请求必须看起来像这样:

http://localhost/index.php?route=news/economics/param1/param2

所以你已经需要一个类从url解析路由参数.这是Routing课程的第一件事.所以在这种情况下,它解决了参数:

> controller:NewsController.php
行动方式:经济行动
>参数:param1和param2

路由类简单地实例化请求控制器,调用请求的方法并传递给定的参数.

但这是你可能已经知道的

现在,您所显示的课程只需将所请求的“路由”解析为正确的控制器/动作.所以例如上面的URL:

http://localhost/index.php?route=news/economics/param1/param2

是英文网址所以说家和消息.假设你想要一个翻译的网址,说荷兰语.那么它将如下所示:

http://localhost/index.php?route=nieuws/economie/param1/param2

所以现在,如果您在浏览器中输入了荷兰语URL,那么您的路由器类将寻找一个名为nieuwsController.php的控制器,但它当然不存在.这就是你的榜样来玩的地方. RouteBuilder类.

当请求这样一个翻译的URL时,您的路由器类应该首先检查是否有一个控制器可用该名称.在这种情况下,nieuwsController.php.如果找不到PHP文件,那么它应该检查某个数组/对象来查看请求的URL是否匹配数组/对象中的任何项.这样一个简单的例子就是这样的:

class MappedRouter
{
    $route = array(
        array(
            'url' => 'nieuws/economie/(.*?)',
            'controller' => 'news',
            'action' => 'economie'
        ),
        array(
            'url' => 'weerbericht/locatie/(.*?)',
            'controller' => 'weather',
            'action' => 'location'
        )
    );
}

所以路由器类只是简单地遍历这个数组,看看其中一个数组是否匹配$route数组的url索引.如果它找到一个匹配,那么它会知道要调用哪个控制器和动作,然后代码就可以正常地继续.路由器类实例化相关的控制器/动作,并从那里继续.

请注意,MappedRouter类只是一个简单的方式来完成您的RouteBuilder示例.

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/12430181/how-does-mvc-routing-work

转载注明原文:php – MVC路由如何工作?