Zend_Router要求不匹配

时间:2009-10-08 12:12:18

标签: zend-framework

我有两条匹配具有相同明显模式的网址的路由,不同之处在于$ actionRoute,只有在变量:action on it等于'myaction'时才应该匹配。

如果我转到 / en / mypage / whatever / myaction ,它会通过$ actionRoute按预期进行。
如果我去 / en / mypage / whatever / blahblah ,它会被$ actionRoute拒绝并与$ genRoute匹配。
如果我转到 / en / mypage / what 它应该与$ genRoute匹配,但它会被$ actionRoute匹配而不是throw和exception,因为动作noactionAction()不存在。

不知道我做错了什么,感谢你的帮助。

        $genRoute = new Zend_Controller_Router_Route(
   ':lang/mypage/:var1/:var2', 
   array(
    'lang'   => '',
    'module'  => 'mymodule',
    'controller' => 'index',
    'action'  => 'index',
    'var1'   => 'noone',
    'var2'   => 'no'
   ),
   array(
    'var1'   => '[a-z\-]+?',
    'lang'   => '(es|en|fr|de){1}'
   )
  );
  $actionRoute = new Zend_Controller_Router_Route(
   ':lang/mypage/:var1/:action', 
   array(
    'lang'   => '',
    'module'  => 'mymodule',
    'controller' => 'index',
    'action'  => 'noaction',
    'var1'   => 'noone',
   ),
   array(
    'action'  => '(myaction)+?',
    'var'   => '[a-z\-]+?',
    'lang'   => '(es|en|fr|de){1}',
   )
  );
  $router->addRoute('genroute',$genRoute);
  $router->addRoute('actionroute',$actionRoute);

1 个答案:

答案 0 :(得分:0)

通过在$ actionRoute中为操作提供默认值('noaction'),您可以使该变量成为可选项。如果你删除它,它应该都可以正常工作。第二条路线中正则表达式模式中的'var'键可能应该是'var1',就像它在你的第一条路线中一样。

所以,你可能希望你的第二条路线是:

  $actionRoute = new Zend_Controller_Router_Route(
   ':lang/mypage/:var1/:action', 
   array(
    'lang'   => '',
    'module'  => 'mymodule',
    'controller' => 'index',
    'var1'   => 'noone',
   ),
   array(
    'action'  => '(myaction)+?',
    'var1'   => '[a-z\-]+?',
    'lang'   => '(es|en|fr|de){1}',
   )
  );