1

我对 Silex 和 Symfony 还很陌生,我正在尝试使用 symfony Form 组件创建一个表单。效果很好,但是在验证/清理方面我不知道该怎么做。

我当然知道 $app->escape($data) 方法,但它似乎不适合我的需要。

在调用 $form->isValid() 方法之前,我想从提交的数据中转义 html 标记。我不想使带有 html 标签的文本无效,只需从文本中转义/删除它们,然后验证获得的值。

所以基本上我想将转义值提供给表单而不是原始值或使用。

我的问题是,只有在删除 html 标签后提交的文本为空时,我才想显示错误消息。

我想写一个自定义约束——因为我在包中没有找到任何关于 html 验证的信息——但在那种情况下,我必须过滤/转义两次,首先是在验证中,然后是在保存数据之前。

我想实现这样的目标:

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());
    }
  }
}

谢谢。

4

2 回答 2

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());
    }
  }
}
于 2012-10-06T23:41:39.573 回答
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 );
于 2017-01-23T09:54:09.490 回答