2016-03-01 87 views
2

我有以下實體領域:斷言正則表達式和TypeGuessing

/**  
* @Assert\Regex(
* pattern = "/^d+\.(jpg|png|gif)$/", 
* htmlPattern = "/^d+\.(jpg|png|gif)$/" 
*) 
**/ 

protected $src; 

形式由這樣的創建:

$builder 
    ->add('src', TextareaType::class, array(//neither is TextType::class working 
     'attr' => array('class' => 'mysrc'), 
)); //pattern will not be rendered 

的問題是,只要我提供的字段類型類TextareaType::class正則表達式模式未呈現爲表單的約束。或換句話說:如果字段類型被猜測,則只呈現正則表達式模式:

$builder 
    ->add('src', null, array( 
     'attr' => array('class' => 'mysrc'), 
)); //pattern will be rendered 

任何解決方法?我想在一個地方,即在我的實體中,而不是在一個控制器或一個表單中有正則表達式模式。

回答

3

葉普,這是它應該如何工作。不僅字段類型被猜測,而且一些選項也是如此,如果類型沒有被猜測出選項。

順便說一句,textarea元素不支持pattern屬性,但是如果你想添加一個:'attr' => array('pattern' => '/jsregex/'),你應該爲客戶端使用與服務器端不同的模式。如果你想在一個地方使用constant

+1

實際上,symfony會在'TextareaType'附加'pattern'屬性,但只有當類型被猜測時,由於不受支持的屬性,它是無效的。由於類型猜測和手動類型定義之間的差異,還有一個驗證問題。有趣的問題。 – chalasr

+0

Thx的信息。我很好,如果模式只傳遞,即使它不受textarea支持。並且問題依然存在於'TextType'中 – musicman

+1

如果你想要或者使用'Column(type =「text」)'',你可以將它作爲屬性選項傳遞給它,並且它將被猜成textarea。 – 1ed

1

也許這一個可以幫助你:

FormType

use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Validator\Validator\ValidatorInterface; 
use Symfony\Component\Validator\Constraints\Regex; 
use YourBundle\Entity\YourEntity; 

public function __construct(ValidatorInterface $validator) 
{ 
    $this->validator = $validator; 
} 

public function getRegexPattern($property) 
{ 
    $pattern = null; 
    $metadata = $this->validator->getMetadataFor(new YourEntity()); 
    $propertyMetadata = $metadata->getPropertyMetadata($property); 
    $constraints = $propertyMetadata[0]->constraints; 

    foreach($constraints as $constraint) { 
     if ($constraint instanceof Regex) { 
      $pattern = $constraint->pattern; 
     } 
    } 

    return $pattern; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('src', TextType::class, array(
     'attr' => array(
      'class' => 'mysrc', 
      'pattern' => $this->getRegexPattern('src') 
     ), 
    )); 
} 

services.yml(所需注入式驗證)

services: 
    app.form.type.your_entity_type: 
     class: YourBundle\Form\YourEntityType 
     arguments: 
      validator: "@validator" 
     tags: 
      - { name: form.type } 

渲染

<input type="text" pattern="/^d+\.(jpg|png|gif)$/" class="src"/> 

像這樣,即使手動設置了TextType,您也會通過從屬性約束中檢索到的模式獲得html驗證。