2012-09-26 18 views
1

我對Silex和Symfony相當陌生,我試圖用symfony表單組件創建表單。這工作正常,但它涉及到驗證/消毒我不知道該怎麼做。如何從Silex中的表單數據過濾html

當然,我知道$ 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()); 
    } 
    } 
} 

感謝。

回答

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

感謝您的回答,我希望有一個內置的過濾輸入支持。有點像約束,但應該清除這些值。 – Damien

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