有没有办法创建匹配/文本而不是/ text /的Zend_Controller_Router?

时间:2009-08-12 18:30:57

标签: php zend-framework

我正在尝试将没有尾部斜杠的URL匹配到一个路由器,并且希望具有尾部斜杠的URL表现正常。我试过了:

$route = new Zend_Controller_Router_Route(
            ':redirectid',
            array(
                'redirectid'    =>  false,
                'controller'    =>  'redirect',
                'action'    =>  'redirect'
            ),
            array('redirectid' => '[a-z0-9]*')
        );

$route = new Zend_Controller_Router_Route_Regex(
            '([a-z0-9]*)',
            array(
                'controller' => 'redirect',
                'action'     => 'redirect'
            )
        );

并且两者都表现出我想要的网址而没有尾随斜杠,但它们仍匹配带尾部斜杠的网址。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

<强>声明: 我强烈建议不要让http://somesite.com/pagehttp://somesite.com/page/成为不同的网页 - 这会让您和访问者感到困惑。

如果您真的致力于此计划 您可以通过创建自己的match()和assemble()函数来创建自己的路由器来处理这个问题,这些函数不会trim()基于尾部斜杠的路径。

class My_Route_Redirector implements Zend_Controller_Router_Route_Interface {
   protected $_defaults;

   public static function getInstance(Zend_Config $config) {
     $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
     return new self($defs);
   }

   public function __construct($defaults=array()) {
     $this->_defaults = $defaults;
   }

   public function match($path, $partial = false) {
     if (preg_match("#^/?([a-z0-9]+)$#i", $path, $matches)) {
       // this is just an idea but what about if you had this test
       // $matches[1] versus the database of redirectors?  and only return true
       // when it found a valid redirector?

       return array('redirectid' => $matches[1]) + $this->_defaults;
     } else {
       return false;
     }
   }

    public function assemble($data = array(), $reset = false, $encode = false, $partial = false)
    {
      if (!isset($data['redirectid'])) return '';
      return $data['redirectid'];
    }
} 

这是空气编码所以它可能有一两个错误 - 它应该像这样工作:

$route = new My_Route_Redirector(
                array(
                        'controller' => 'redirect',
                        'action'     => 'redirect'
                )
        );