Как предотвратить Zend Framework 1 от разрешения имени контроллера с точкой на конце?

У меня есть веб-сайт, который работает на Zend Framework 1.12. У него есть контроллер с именем "пользователи". Когда я ввожу его имя неправильно - http://mywebsite/userss - Я по праву получаю сообщение о том, что такого контроллера не существует. Однако, когда я добавляю точку в конец ее имени:http://mywebsite/users., ошибка говорит о том, что видимость называется users./index.phtml не существует. Интересно, что он по-прежнему правильно получает контроллер (пользователей).

У меня есть два вопроса по этому вопросу:

  1. Как и почему он игнорирует точку в конце и все равно правильно получает контроллер?
  2. Есть ли способ отклонить такие имена контроллеров, без каких-либо изменений в ядре платформы?

1 ответ

Отличный вопрос, но чтобы ответить на него, нам нужно найти исходный код 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));
}

Здесь вы видите -, _, а также . убрал на самом первом шаге.

Даже сегодня эта функция настроена на удаление - а также . но не _

Вот текущая версия этой функции 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));

Функция getWordDelimeter() возвращает массив array('-', '.'); [строка], таким образом, удаляя их первым делом в URL, который отвечает на ваш первый вопрос. Что касается второго вопроса, вы можете изменить эту строку и удалить . от него.

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

После этого Despatcher больше не найдет контроллер или любой компонент URI с . в теме.

Другие вопросы по тегам