Zend Framework и магические кавычки

TuiKiken 21 октября 2009 в 12:48 1,9k
Zend Framework & Magic QuotesСразу стоит заметить, что с выходом php 6 эта статья будет не актуальна, а пока…

Каждый, кто имеет опыт работы с 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.


Спасибо за внимание, удачного дня.
Проголосовать:
+2
Сохранить: