Zend_Controller_Router_Route - PullRequest
       7

Zend_Controller_Router_Route

2 голосов
/ 31 января 2011

Я пытаюсь создать Маршрутизатор, который может реагировать на эту структуру:

module/controller/action/id и module/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), но результат роутера 'administratorrador' в 'http://www.domain.cl/administrador/productos/index/0/2' (module=>administrador, controller=>productos,action=>index,id=>0,page=>2)

Я очень озадачен тем, как это работает в подобных случаях.Я попытался сделать два маршрутизатора, где первый имеет только параметр «id», а другой - «page».А из помощника по URL используйте его как:

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 31 января 2011

У меня была похожая проблема, и я решил эту проблему, определив только один маршрут, подобный этому

$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 голос
/ 31 января 2011

Посмотрите на динамические сегменты в маршрутах. Это не совсем то, что вы хотите, но это может быть полезно в вашем случае.

...