很好的问题,但要回答这个问题,我们已经挖掘了 Zend Framework 的来源,最初回到 2007 年,专门设计了一个函数 _formatName() 来从 URL 名称中删除此类异常。可能比这更早,但我不知道。
这个特别的部分来自 Zend Framework 0.1.4(历史权利??):)
protected function _formatName($unformatted)
{
$unformatted = str_replace(array('-', '_', '.'), ' ', strtolower($unformatted));
$unformatted = preg_replace('[^a-z0-9 ]', '', $unformatted);
return str_replace(' ', '', ucwords($unformatted));
}
在这里,您会看到 -、_ 和 . 在第一步中被删除。
即使在今天,此功能仍设置为删除 - 和 .,但不会删除 _
这是function的当前 Zend Framework 1.x 版本
protected function _formatName($unformatted, $isAction = false)
{
// preserve directories
if (!$isAction) {
$segments = explode($this->getPathDelimiter(), $unformatted);
} else {
$segments = (array) $unformatted;
}
foreach ($segments as $key => $segment) {
$segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));
$segment = preg_replace('/[^a-z0-9 ]/', '', $segment);
$segments[$key] = str_replace(' ', '', ucwords($segment));
}
return implode('_', $segments);
}
就像在 line 中清除 URI 段之前一样
$segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));
函数getWordDelimeter() 返回一个由array('-', '.'); 组成的数组[line] 从而在 URL 中首先删除它们,这回答了您的第一个问题。关于第二个问题,你可以修改this这一行,把.去掉。
protected $_wordDelimiter = array('-', '.');
在此之后,调度程序将不再找到控制器或任何带有. 的 URI 组件。