2

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

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)但是路由器“管理员”导致'http://www.domain.cl/administrador/productos/index/0/2' (module=>administrador, controller=>productos,action=>index,id=>0,page=>2)

我对它在这种情况下的工作方式感到非常困惑。我试图制作两个路由器,其中第一个只有“id”参数和另一个“页面”参数。并从 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');

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

谢谢

4

2 回答 2

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);

您的要求基本上会导致大量猜测工作,因此有产生意外结果的风险。

于 2011-01-31T09:06:35.203 回答
1

查看路线中的动态段。这不完全是您想要的,但它可能对您的情况有所帮助。

于 2011-01-31T03:29:58.607 回答