Php 如何从Silex中的表单数据中筛选html

Php 如何从Silex中的表单数据中筛选html,php,symfony,escaping,silex,Php,Symfony,Escaping,Silex,我对Silex和Symfony非常陌生,我正在尝试使用Symfony表单组件创建一个表单。这很好,但说到验证/消毒,我不知道怎么做 当然我知道$app->escape($data)方法,但它似乎不适合我的需要 在调用$form->isValid()方法之前,我希望从提交的数据中转义html标记。我不想用html标记使文本无效,只需从文本中转义/删除它们,然后验证获得的值 所以基本上我想给表单赋转义值,而不是原始值或使用值 我的问题是,仅当删除html标记后提交的文本为空时,我才希望显示错误消息

我对Silex和Symfony非常陌生,我正在尝试使用Symfony表单组件创建一个表单。这很好,但说到验证/消毒,我不知道怎么做

当然我知道$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());
    }
  }
}
谢谢。

只是一个快捷方式,您必须使用函数删除html标记

我的问题是,我只想在 删除html标记后,提交的文本为空

例如:

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

如果要在数据进入表单之前对其进行预清理,可以对所有路由或特定路由使用
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 );

谢谢你的回答,我希望有一个内置的支持过滤输入。类似于约束,但这应该会清除值。
$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 );