zend 路由

PHP技术交流群 170855791

Zend_controller_Router_Rewrite类是标准的框架路由器。路由是个过程,在这个过程中它取出URI的端点(跟着基本URL的URI的那部分)并把它分解成参数来决定使用那个模块、哪个控制器以及控制器中的动作。模块,控制器、动作和其它一些参数被打包到Zend_Controller_Requert_Http对象中(请求对象,因此可以通过Zend_Controller_Request::getParam()或Zend_Controller_Action::_getParam()方法来访问URL中的一些参数),接着这个对象由Zend_Controller_Dispatcher_Standard来处理。路由只发生一次:当请求最初被接受和第一个控制器被派遣之前。
zend路由器可以通过前端控制器getRouter()来获取路由实例,以下是Front.php中的getRouter方法:

1 public function getRouter()
2 {
3 if (null == $this->_router) {
4 require_once 'Zend/Controller/Router/Rewrite.php';
5 $this->setRouter(new Zend_Controller_Router_Rewrite());
6 }
7
8 return $this->_router;
9 }

$route = $ctrl->getRouter();
通过Rewrite.php方法中的getRouter($name, Zend_Controller_Router_Route_Interface $route)方法添加自定义路由,该方法接受两个参数:
第一个参数为要添加的路由名
第二个参数需要传递一个实现了Zend_Controller_Router_Route_Interface接口的实例(通常为Zend_Controller_Router_Route类的实例)。
这里有三个特殊的变量可用于路由'module','controller','action'。这些特殊的变量被Zend_Controller_Dispatcher用来找出控制器和动作然后派遣过去。例:

new Zend_Controller_Router_Route('taq/:var',array('module' => 'test', 'controller' => 'test','action' => 'index'));

Zend_Controller_Router_Route构造方法共可以传递五个参数
__construct($route, $defaults = array(), $reqs = array(), Zend_Translate $translator = null, $locale = null)
1、$route:它是路由的定义,用于映射到URL中除基地址部分的剩下部分,路由定义静态和动态部分,他们由('/') 符分开,静态部分只是简单的字符串:taq部分。动态部分,被叫做变量,用预设的冒号来标记变量名: :var。同时这个变量可以设置一个默认值,如:'var'='5'附加到参数数组中,默认var变量为5。同时它也可以只是一个简单的字符串'taq',称为静态路由。
2、$defaults = array():用于定义所用的模块,控制器以及所使用的动作。
3、$reqs = array():用于定义所匹配的变量的正则表达式。如:array(‘var‘=>‘\d+‘),只有当变量值匹配该正则时才回执行这个路由,否则会跳过该路由继续寻找相匹配的路由。

缺省路由被存储在RewriteRouter名(index)为'default'的简单的Zend_Controller_Router_Module对象。它被创建多多少少像下面这样:
$compat = new Zend_Controller_Router_Module(array(), $dispatcher, $request);
$this->addRoute('default', $compat);
若不想使用这个默认路由,可以重写自己的缺省路由,只需把它存储在default名字既可,或使用removeDefaultRoutes()完全清楚它:
$router->removeDefaultRouters();

最后使用RouterRewrite中的addRoute($name,$route)方法添加路由
$name:为路由名称
$route:为路由实例

 完整代码:

1 //设置路由
2 $router = $ctrl->getRouter();
3 $route = new Zend_Controller_Router_Route('taq/:var',array('module' => 'test', 'controller' => 'test','action' => 'index'));
4 $router->addRoute('taq', $route);


补充:

路由采用倒叙匹配(后进先出),所以应当将常用路由放到下面来确保能够首先被定义
定义了’id/:aid’形式的路由规则之后,在动作控制器中,使用
$this->_request->getParam(‘aid’);
来获得id值.

原文地址:https://www.cnblogs.com/gbyukg/p/2184318.html