我对Silex和Symfony很新,我正在尝试使用symfony Form组件创建一个表单。这样做很好,但是对于验证/消毒,我不知道该怎么做。
当然我知道$ app-> escape($ data)方法,但它似乎不符合我的需要。
在调用$ form-> isValid()方法之前,我想从提交的数据中转义html标记。我不想使用html标签使文本无效,只能从文本中转义/删除它们,然后验证获得的值。
所以基本上我想将转义值提供给表单而不是原件或使用。
我的问题是,只有在删除html标记后提交的文本为空时,我才会显示错误消息。
我想写一个自定义约束 - 因为我没有在包中找到关于html验证的任何内容 - 但在这种情况下我必须过滤/转义两次,首先在验证中然后保存数据。< / p>
我想实现这样的目标:
if ($request->getMethod() == 'POST') {
$comment = $request->get('comment');
if($comment) {
foreach($comment as &$value) {
$value = $app->escape($value);
}
$cleared = new Request(array(), array('comment' => $comment));
$form->bindRequest($cleared);
if ($form->isValid()) {
var_dump($form->getData());
}
}
}
感谢。
答案 0 :(得分:3)
$app->escape()只是htmlspecialchars()的快捷方式,您必须使用strip_tags()函数删除html标记。
我的问题是我只想显示错误消息 删除html标签后,提交的文本为空。
$form->get('FILED_NAME')->addError(new Form\FormError('ERROR'));
例如:
if ($request->getMethod() == 'POST') {
$comment = $request->get('comment');
if($comment) {
$emptyCM = false;
foreach($comment as &$value) {
$value = strip_tags($value);
if (empty($value)) $emptyCM = true;
}
if ($emptyCM)
$form->get('comment')->addError(new Form\FormError('my custom error message'));
$cleared = new Request(array(), array('comment' => $comment));
$form->bindRequest($cleared);
if ($form->isValid()) {
var_dump($form->getData());
}
}
}
答案 1 :(得分:0)
如果您希望在进入表单之前对所有数据进行预先清理,则可以使用before
过滤器,用于所有路由或特定路由。
以下示例从GET和POST中删除字符串参数中的所有标记。如果您的参数是数组(如初始示例中所示),则需要添加另一个if
分支。如果您的参数是深度嵌套的,则需要一个递归函数进行过滤。
$app->before( function( Request $request ) {
foreach ( [ $request->request, $request->query ] as $parameterBag ) {
foreach ( $parameterBag->keys() as $key ) {
if ( is_string( $parameterBag->get( $key ) ) ) {
$parameterBag->set( $key, strip_tags( $parameterBag->get( $key ) ) );
}
}
}
}, Application::EARLY_EVENT );