4

我有一个在 Zend Framework 1.12 上运行的网站。它有一个名为“用户”的控制器。当我输入错误的名称时http://mywebsite/userss——我理所当然地得到一个错误,说这样的控制器不存在。但是,当我在其名称的末尾添加一个点时: http://mywebsite/users.,错误表明调用的视图脚本users./index.phtml不存在。有趣的是,它仍然可以正确获取控制器(用户)。

关于这个问题,我有两个问题:

  1. 它如何以及为什么在最后忽略一个点,并且仍然正确地获得一个控制器?
  2. 有没有办法拒绝这样的控制器名称,而不对框架的核心进行任何修改?
4

1 回答 1

1

很好的问题,但要回答这个问题,我们已经挖掘了 Zend 框架的来源,最初回到 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));
}

在这里,您会在第一步中看到-_和删除。.

即使在今天,此功能也设置为删除-.不是_

这是该功能的当前 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);
}

就像在此行中清除 URI 段之前一样

$segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));

该函数返回一个[line]getWordDelimeter()数组,因此首先在 URL 中删除它们,这回答了您的第一个问题。关于第二个问题,您可以修改行并从中删除。array('-', '.');.

protected $_wordDelimiter = array('-', '.');

在此之后,调度程序将不再找到控制器或任何带有.它的 URI 组件。

于 2013-07-22T11:37:13.120 回答