路由

路由器主要负责解析一个请求并且决定什么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.

  1. <?php
  2. /**
  3. * 对于请求request_uri为"/foo/bar/dummy/1"
  4. * 则最后参加路由的request_uri为"/foo/bar/dummy/1"
  5. * 然后, 通过对URL分段, 得到如下分节
  6. * foo, bar, dummy, 1
  7. * 然后判断foo是不是一个合法的Module, 如果不是, 则认为结果如下:
  8. */
  9. array(
  10. "module" => "",
  11. "controller" => "foo",
  12. "action" => "bar",
  13. "params" => array(
  14. "dummy" => 1,
  15. )
  16. )
  17. /**
  18. * 而如果在配置文件启用了moduel: resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
  19. * 且APPLICATION_PATH "/modules" 包含了foo目录
  20. * 则此处就会认为foo是一个合法模块, 则结果如下
  21. */
  22. array(
  23. "module" => "foo",
  24. "controller" => "bar",
  25. "action" => "dummy",
  26. "params" => array(
  27. 1 => NULL,
  28. )
  29. )
  30. ?>

Star_Controller_Router_Route_Static

有时候,特定的路由被设定成型,启动正则表达式引擎将影响执行效率。对这种情形的答案是使用静态路由:

  1. <?php
  2. require "Star/Application/Bootstrap/Bootstrap.php";
  3. class Bootstrap extends Star_Application_Bootstrap_Bootstrap
  4. {
  5. protected function _initRoute()
  6. {
  7. $route = new Star_Controller_Router_Route_Static(
  8. "login",
  9. array(
  10. "controller" => "auth",
  11. "action" => "login",
  12. ),
  13. );
  14. $this->front->addRouter("login", $route);
  15. }
  16. }
  17. ?>

Star_Controller_Router_Route_Regex

上面介绍了默认路由和静态路由,可能还无法满足你的需求。下面来介绍下正则路由,可以通过正则强大的力量来满足配置我们的路由规则,只是稍微有点复杂,希望你能够好好掌握它。正则路由:

  1. <?php
  2. require "Star/Application/Bootstrap/Bootstrap.php";
  3. class Bootstrap extends Star_Application_Bootstrap_Bootstrap
  4. {
  5. protected function _initRoute()
  6. {
  7. $route = new Star_Controller_Router_Route_Regex(
  8. "product/(\d+)",
  9. array(
  10. "controller" => "product",
  11. "action" => "view",
  12. ),
  13. array(
  14. 1 => "id",
  15. )
  16. );
  17. $this->front->addRouter("product", $route);
  18. }
  19. }
  20. ?>

这样,我们就简单的将变量1映射到了id变量名,这样就设置了id变量,同时你也可以在控制器里面获取到它的值.