2

这使我可以轻松获得动态输入变量,而不是像 /en/etcetcetc 那样放置静态前缀,但问题是所有控制器都被阻止了。一切都进入索引/索引。

问题:我怎么知道这条规则允许现在的一切,但不要跟踪它是否包含http://site.com/donotcatch/mehttp://site.com/iamnotbelongstodynamic1/blabla

  protected  function _initRoutes()
  { 
     ...
      $dynamic1 = new Zend_Controller_Router_Route(
            '/:variable0/:variable1',
            array(
                'controller' => 'index',
                'action'     => 'index'),
                array(
                      'variable0' => '^[a-zA-Z0-9_]*$',
                      'variable1' => '^[a-zA-Z0-9_]*$',
                    )
            );

跟进:

通常,我总是相信是的,我们可以,所以,我们可以像这样在 dynamic1 不与我的其他静态控制器交互的情况下这样做:

  // http://site/yeswecan/blabla
  // variable0 = yeswecan
  // variable1 = blabla
  $dynamic1 = new Zend_Controller_Router_Route(
        '/:variable0/:variable1',
        array(
            'controller' => 'index',
            'action'     => 'index'),
            array(
                  'variable0' => '^[a-zA-Z]*$',
                  'variable1' => '^[a-z0-9_]*$',
                )
        );


  // http://site/ajax/whatever...
  // solves it
  $dynamic2 = new Zend_Controller_Router_Route(
        '/ajax/:variable0',
        array(
            'controller' => 'ajax',
            'action'     => ''
            ),
            array(
                  'variable0' => '^[a-zA-Z0-9_]*$',
                )
        );

  // http://site/order/whatever...
  // solves it
  $dynamic3 = new Zend_Controller_Router_Route(
        '/order/:variable0',
        array(
            'controller' => 'order',
            'action'     => ''),
            array(
                  'variable0' => '^[a-zA-Z0-9_]*$',
                )
        ); 

笔记:

  • 控制器仍然失败,例如 http://site/ajax/whatever总是去 /ajax/index 我想把它作为 /ajax/user-inserted-value 发送

如何通过保留 $dynamic1 来修复 $dynamic2 和 $dynamic3 ?

4

2 回答 2

0

我不认为 Zend 支持使用“否定”匹配条件。幸运的是,正则表达式可以使用负前瞻或后瞻:

例如,以下正则表达式:

(?!foo$|bar$)(?<!^foo|^bar)$

告诉正则表达式解析器排除完全符合fooor的匹配项bar

fbarbfoo并且fbarf仍然会匹配。

注意:在您上面的正则表达式中,[a-zA-Z0-9_]\w.

于 2011-01-04T21:28:07.193 回答
0

嘿,现在听起来好像您只是希望每个(ajax)动作都进行自己的动作。你是这个意思吗?如果是这样,我认为你可以使用这个:

  $dynamic2 = new Zend_Controller_Router_Route(
        '/ajax/:action',
        array(
            'controller' => 'ajax'
            ),
            array(
                  'action' => '^[a-zA-Z0-9_]*$',
                )
        );

您还可以为其余与您的正则表达式不匹配的 ajax 调用添加更通用的调用:

  $dynamic1_and_a_half = new Zend_Controller_Router_Route(
        '/ajax/:variable',
        array(
            'controller' => 'ajax',
            'action' => 'index'
            )
        );

如果这不是您的意思,您是否也可以发布您的控制器,以及您希望 /ajax/whatever 调用的位置?

于 2011-01-08T09:45:39.233 回答