路由
路由器主要负责解析一个请求并且决定什么module、controller、action被请求;它同时也定义了一种方法来实现用户自定义路由,这也使得它成为最重要的一个MVC组组件.这样允许开发者很容易的设计出我们自定义的路由协议.然而,默认的路由组件其实已经服务得我们很好了.记住,如果我们需要一个非标准的路由协议时候,我们就可以自定义一个自己的路由协议,而不用采用默认的路由协议.
默认路由
默认情况下,我们的使用的路由协议是Star_Controller_Router_Route_Module,获取request_uri片段, 具体的策略是, 根据"/"对request_uri分段, 依次得到Module,Controller,Action, 在得到Module以后, 还需要根据Star_Controller_Front::isValidModule来判断Module是否是合法的Module, 如果不是, 则认为Module并没有体现在request_uri中, 而把原Module当做Controller, 原Controller当做Action.
<?php
/**
* 对于请求request_uri为"/foo/bar/dummy/1"
* 则最后参加路由的request_uri为"/foo/bar/dummy/1"
* 然后, 通过对URL分段, 得到如下分节
* foo, bar, dummy, 1
* 然后判断foo是不是一个合法的Module, 如果不是, 则认为结果如下:
*/
array(
"module" => "",
"controller" => "foo",
"action" => "bar",
"params" => array(
"dummy" => 1,
)
)
/**
* 而如果在配置文件启用了moduel: resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
* 且APPLICATION_PATH "/modules" 包含了foo目录
* 则此处就会认为foo是一个合法模块, 则结果如下
*/
array(
"module" => "foo",
"controller" => "bar",
"action" => "dummy",
"params" => array(
1 => NULL,
)
)
?>
Star_Controller_Router_Route_Static
有时候,特定的路由被设定成型,启动正则表达式引擎将影响执行效率。对这种情形的答案是使用静态路由:
<?php
require "Star/Application/Bootstrap/Bootstrap.php";
class Bootstrap extends Star_Application_Bootstrap_Bootstrap
{
protected function _initRoute()
{
$route = new Star_Controller_Router_Route_Static(
"login",
array(
"controller" => "auth",
"action" => "login",
),
);
$this->front->addRouter("login", $route);
}
}
?>
Star_Controller_Router_Route_Regex
上面介绍了默认路由和静态路由,可能还无法满足你的需求。下面来介绍下正则路由,可以通过正则强大的力量来满足配置我们的路由规则,只是稍微有点复杂,希望你能够好好掌握它。正则路由:
<?php
require "Star/Application/Bootstrap/Bootstrap.php";
class Bootstrap extends Star_Application_Bootstrap_Bootstrap
{
protected function _initRoute()
{
$route = new Star_Controller_Router_Route_Regex(
"product/(\d+)",
array(
"controller" => "product",
"action" => "view",
),
array(
1 => "id",
)
);
$this->front->addRouter("product", $route);
}
}
?>
这样,我们就简单的将变量1映射到了id变量名,这样就设置了id变量,同时你也可以在控制器里面获取到它的值.
当前内容版权归 starframework 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 starframework .