Как предотвратить Zend Framework 1 от разрешения имени контроллера с точкой на конце?
У меня есть веб-сайт, который работает на Zend Framework 1.12. У него есть контроллер с именем "пользователи". Когда я ввожу его имя неправильно - http://mywebsite/userss
- Я по праву получаю сообщение о том, что такого контроллера не существует. Однако, когда я добавляю точку в конец ее имени:http://mywebsite/users.
, ошибка говорит о том, что видимость называется users./index.phtml
не существует. Интересно, что он по-прежнему правильно получает контроллер (пользователей).
У меня есть два вопроса по этому вопросу:
- Как и почему он игнорирует точку в конце и все равно правильно получает контроллер?
- Есть ли способ отклонить такие имена контроллеров, без каких-либо изменений в ядре платформы?
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 с .
в теме.