Php 有没有一种方法可以创建一个Zend_控制器_路由器,它匹配/text但不匹配/text/?
我正在尝试将没有尾随斜杠的URL与一个路由器进行匹配,并希望那些带有尾随斜杠的URL以正常方式运行。我试过:Php 有没有一种方法可以创建一个Zend_控制器_路由器,它匹配/text但不匹配/text/?,php,zend-framework,Php,Zend Framework,我正在尝试将没有尾随斜杠的URL与一个路由器进行匹配,并希望那些带有尾随斜杠的URL以正常方式运行。我试过: $route = new Zend_Controller_Router_Route( ':redirectid', array( 'redirectid' => false, 'controller' => 'redirect',
$route = new Zend_Controller_Router_Route(
':redirectid',
array(
'redirectid' => false,
'controller' => 'redirect',
'action' => 'redirect'
),
array('redirectid' => '[a-z0-9]*')
);
及
两者的行为都与我想要的没有尾随斜杠的URL的行为完全相同,但它们仍然匹配有尾随斜杠的URL。有什么办法解决这个问题吗?免责声明: 我强烈建议不要制作和成为不同的页面——这会让你和你的访问者感到困惑 如果您真正致力于此计划 您可以创建自己的路由器,您可以通过创建自己的match()和assembly()函数来处理此问题,这些函数不会
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'];
}
}
这是空气编码的,所以它可能有一两个bug需要解决-它应该是这样工作的:
$route = new My_Route_Redirector(
array(
'controller' => 'redirect',
'action' => 'redirect'
)
);
非常感谢你!它工作得很好,只是$path仍然包含开头/,“#^/([a-z0-9]+)$#i”使它工作。事实上,我确实在为do it/don it而与自己斗争——这是为了一个tinyurl式的重定向器,我不只是想匹配所有内容,所以我仍然可以使用/admin/或/stats/等。为这些设置特定的路由可能更可取,我得考虑一下这个问题。你可以把基本的:controller/:action路由降到/admin/index/,对吗?是的,这就是我最后要做的-基本上我只需要一个参数(/admin/)和一个静态路由来路由我需要的路由,那些有多个(/admin/options/)的路由无论如何,我都会使用adminController。我只是想再看一次-你可以让这个自定义路由只在找到与你的DB行匹配的内容时返回值-它甚至可以设置“redirectTo”参数。然后/admin仍然是一个“默认”路由-你不需要特殊情况的静态。嗯,我喜欢这个想法-即使它会去掉重定向控制器的所有逻辑,毕竟,如果我查询数据库,我可以直接在路由器中重定向。
$route = new My_Route_Redirector(
array(
'controller' => 'redirect',
'action' => 'redirect'
)
);