
Каждый, кто имеет опыт работы с php, наверняка знает или слышал о директиве «magic_quotes_gpc»(магические кавычки). Если флаг директивы установлен в «On», то происходит автоматическое экранирование данных передаваемых в массивах $_GET, $_POST, $_COOKIE(о чём и намекает аббревиатура gpc на конце директивы).
При разработке сайта на Zend Framework'е одним из требований является отключенные «magic_quotes_gpc». Всё дело в том, что Zend Framework сам экранирует данные и при включённой директиве «magic_quotes_gpc» получается двойное экранирование, что не есть хорошо и красиво. Проблема не была бы столь острой, если бы все хостинги давали право менять значение «magic_quotes_gpc». Я уже не раз сталкивался с такой проблемой и нашёл на мой взгляд довольно элегантное решение.
В том случае, когда на сервере директива «magic_quotes_gpc» строго установлена в «On» мы будем подключать небольшой плагин, чтобы избежать двойного экранирования:
/**
* Плагин убирающий экранирование.
*
* Применяется в тех случаях, когда на сервере запрещено отключать magic_quotes_gpc.
*
* @category Zend_Controller_Plugin
*/
class Singular_Controller_Plugin_StripMagicQuotes extends Zend_Controller_Plugin_Abstract
{
/**
* Вызывается до того, как Zend_Controller_Front войдет в цикл диспетчеризации.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
/** Проверяем включина ли директива magic_quotes_gpc */
if (get_magic_quotes_gpc()) {
/** Извлекаем полученые параметры */
$params = $request->getParams();
/** Рекурсивно применяем метод "exStripSlashes" к каждому элементу массива */
array_walk_recursive($params, array($this, 'exStripSlashes'));
/** Устанавливаем обработанные параметры */
$request->setParams($params);
}
}
/**
* Удаляет экранирование символов.
*
* @param mixed $value
* @param mixed $key
* @return void
*/
private function exStripSlashes(&$value, $key)
{
/** Удаляем экранирование символов */
$value = stripslashes($value);
}
}
* This source code was highlighted with Source Code Highlighter.
Не забудьте переименовать имя класса согласно конвенции фреймворка и зарегистрировать плагин:
/** Получаем экземпляр фронт-контроллера */
$front = Zend_Controller_Front::getInstance();
/** Регистрируем плагин */
$front->registerPlugin(new Singular_Controller_Plugin_StripMagicQuotes());
* This source code was highlighted with Source Code Highlighter.
Спасибо за внимание, удачного дня.