你能为Zend Framework 1.x的自动视图变量转义推荐任何好的解决方案吗?
到目前为止我已尝试过:
$this->var->object()->string
view streams
的自定义解决方案,类似于Rob Allen's escaper,但使用正则表达式解析语法始终失败答案 0 :(得分:1)
这是我的解决方案
/**
* 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);
}
}
}
您需要做的就是将其设置为引导程序中的视图。
答案 1 :(得分:0)
如果我想创建一个自动转发器,我会创建一个在postDispatch
中运行的ZF插件:
postDispatch()。此回调允许代理或过滤器行为。通过更改请求并重置其调度标志(通过Zend_Controller_Request_Abstract :: setDispatched(false)),可以指定一个新的操作来进行调度。 source
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);
}
}
我希望无论以上样本的状态如何,我都会解释我的想法。