2016-03-04 116 views
0

目前我正在試圖找出如何處理TextType場的表單字段驗證在Symfony2中的表單生成器上下文。Symfony的表單驗證值是數組

有應該明確地與兩個可能值中的一個手動填充的字段([電子郵件=所有],[電子郵件=試驗])。它旨在成爲一些安全功能,以確保用戶明確知道他下一步在做什麼。

我不知道是否有可用於驗證字段的輸入值,以適應的兩個已知選項之一驗證約束。可以[email = all]或[email = test]。在純PHP,我會做像這樣

function isValid($value){ 
    $options = array("[email=all]","[email=test]"); 
    return (in_array($value, $options)) ? true : false; 
} 

我知道,我要建立一個自定義的驗證約束,但也許這可能甚至Symfony的標準約束來解決?

在此先感謝!

回答

3

可以使用Choice約束。

一個例子:

// src/AppBundle/EntityAuthor.php 
namespace AppBundle\Entity; 

use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints as Assert; 

class Author 
{ 
    protected $gender; 

    public static function loadValidatorMetadata(ClassMetadata $metadata) 
    { 
     $metadata->addPropertyConstraint('gender', new Assert\Choice(array(
      'choices' => array('male', 'female'), 
      'message' => 'Choose a valid gender.', 
     ))); 
    } 
} 
+0

感謝您的回答。這正是我期待的!親切的問候! – barbieswimcrew

1

是的,這是可能的!
您應該使用Callback constraint驗證或Expression constraint。最後是最簡單實用的方法。 考慮一個實體,稱爲Task

<?php 

namespace AppBundle\Entity; 

class Task 
{ 
    protected $id; 
    protected $title; 

    public function setTitle($title) 
    { 
     $this->title = $title; 

     return $this; 
    } 
    public function getTitle() 
    { 
     return $this->title; 
    } 

    //... 
} 

現在我們假設title屬性必須有一個酒吧字,或者一些值(title屬性)是否在定義的數組:

# src/AppBundle/Resources/config/validation.yml 
    AppBundle\Entity\Task: 
     properties: 
      title: 
       - Expression: 
        expression: "this.getTitle() in ['foo', 'bar']", 
        message: "Title must be 'foo' or 'bar'!" 
       - NotBlank: ~ 

因此,在特定情況下,僅僅通過['[email=all]', '[email=test]']交換['foo', 'bar']或任何你想要的。

+0

感謝您的幫助。我不是對實體本身進行驗證的朋友(不管是否通過yml或註釋)。有沒有辦法將它直接設置爲表單構建器類中的約束? – barbieswimcrew