Zend_Controller_Router_Route中

时间:2011-01-31 00:52:35

标签: php zend-framework zend-controller-router

我正在尝试创建一个可以响应此结构的路由器:

module/controller/action/idmodule/controller/action/page

唯一的区别是'id'或'page'。我正在使用此代码:

$routeAdmin = new Zend_Controller_Router_Route(
  'administrador/:controller/:action/:id/:pg',
  array(
    'module' => 'administrador',
    'controller' => 'index',
    'action' => 'index',
    'id' => 0,
    'pg' => 1
  ),
  array(
    'id' => '\d+',
    'pg' => '\d+'
  )
);
$router->addRoute('administrador', $routeAdmin);

问题是在某些情况下我想要:

'http://www.domain.cl/administrador/productos/2' => (module=>administrador, controller=>productos,page=>2)但路由器的“administrador”结果为'http://www.domain.cl/administrador/productos/index/0/2' (module=>administrador, controller=>productos,action=>index,id=>0,page=>2)

我对这样的案件如何运作感到非常困惑。我尝试制作两个路由器,其中第一个只有'id'参数和另一个'page'参数。并从url helper中使用它:

  1. $this->url(array('module' => 'administrador', 'controller' => 'productos', 'action' => 'index', 'id' => 0), 'administradorId');

  2. $this->url(array('module' => 'administrador', 'controller' => 'productos', 'action' => 'index', 'page' => 1), 'administradorPg');

  3. 但是当我使用路由器时总是选择添加到路由器的最后一个($router->addRoute('routerIdentifier', $route);

    由于

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,我通过定义这样一条路线来解决这个问题

$routeAdmin = new Zend_Controller_Router_Route(
  'administrador/:controller/:action/:id/:pg',
  array(
    'module' => 'administrador',
    'controller' => 'index',
    'action' => 'index',
    'id' => 0
  ),
  array(
    'id' => '\d+'
  )
);
$router->addRoute('administrador', $routeAdmin);

actions中,您需要获取id并在id所在的位置进行检查,例如,如果您在/administrador/events/view/1那么你可以在事件表中查看,或者如果你在/administrador/pages/view/1,那么你会寻找一个页面。

但是当id可能是某个控制器和操作中的事件或页面时,问题才真正开始。唯一真正解决此问题的方法是明确设置您使用的id类型

/administrador/events/view/index/id/1

/administrador/pages/view/index/page/1

如果要删除索引部分,请设置

之类的路径
$routeAdmin = new Zend_Controller_Router_Route(
  // Remove the action from here and explicitly set the controller
  'administrador/pages/:pg',
  array(
    'module' => 'administrador',
    'controller' => 'pages',
    // Then set the default action here
    'action' => 'index',
    'pg' => 0
  ),
  array(
    'pg' => '\d+'
  )
);
$router->addRoute('administradorpages', $routeAdmin);

你的要求基本上会导致很多猜测工作,从而产生意外结果的风险。

答案 1 :(得分:1)

查看路线中的dynamic segments。这不完全是你想要的,但在你的情况下可能会有所帮助。