Автоматический перевод переменных для Zend Framework - PullRequest
2 голосов
/ 29 июня 2011

Можете ли вы порекомендовать какое-нибудь хорошее решение для автоматического экранирования переменных вида для Zend Framework 1.x?

Я уже пробовал:

  • ZF2 реализация;Похоже, что он не экранирует синтаксис переменных следующим образом: $this->var->object()->string
  • gnix-view , очень хорошо, но имеет неприятную ошибку рекурсии
  • пользовательских решений на основе view streams, аналогично Робу Аллену, убегающему , но синтаксический анализ с регулярным выражением всегда завершается неудачей
  • Twig (нет хорошей поддержки помощников вида и макета)

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Вот мое решение

/**
 * Purifies all data passed to view
 *
 * @author miholeus
 */
class HTMLPurifier_View extends Zend_View {
    protected $_vars = array();

    public function __set($key, $val)
    {

        if(is_string($val)) {
            $purified = $this->escape($val);
        } elseif(is_array($val)) {
            $purified = array_map(array($this, 'traverseSingle'), $val);
        } else { // other types: integers, bools, objects
            $purified = $this->traverseSingle($val);
        }

        $this->_vars[$key] = array(
            'raw' => $val,
            'purified' => $purified
        );

        return $this;
    }

    public function getRaw($key)
    {
        if(isset($this->_vars[$key])) {
            return $this->_vars[$key]['raw'];
        }
        return null;
    }

    public function __get($key)
    {
        if(isset($this->_vars[$key])) {
            return $this->_vars[$key]['purified'];
        }
        return null;
    }

    private function traverseSingle($element)
    {
        if(is_object($element)) {
            $reflect = new ReflectionObject($element);
            foreach ($reflect->getProperties(ReflectionProperty::IS_PUBLIC) as $prop) {
              $element->{$prop->getName()} = $this->escape($element->{$prop->getName()});
            }
            return $element;
        } else {
            return $this->escape($element);
        }
    }
}

Все, что вам нужно сделать, это установить его в качестве вашего представления в начальной загрузке.

0 голосов
/ 04 июля 2011

если бы я хотел сделать автоматический переход, я бы создал плагин ZF, который запускается в postDispatch:

postDispatch () вызывается после того, как диспетчер отправил действие. Этот обратный вызов учитывает поведение прокси или фильтра. Изменяя запрос и сбрасывая его отправленный флаг (через Zend_Controller_Request_Abstract :: setDispatched (false)), можно указать новое действие для отправки. mybe, некоторое использование htmlprifier было бы умной работой :)

class Automatic_Escaper extends Zend_Controller_Plugin_Abstract{
   public function postDispatch(Zend_Controller_Request_Abstract $request)
    {
        $response = $this->getResponse();
        $htmlpurifier = Zend_Registry::get('purifier');
        $safe = $htmlpurifier->purify($response);
        return $this->setResponse($safe);
    }
}

Надеюсь, я объяснил свою идею независимо от статуса, приведенного выше.

...