2015-11-03 51 views
8

我有一個擁有這些字段的實體。用Symfony 2中的消息輸出實體約束條件

class User implements UserInterface, \Serializable 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="first_name", type="string", length=64) 
    * @Assert\NotBlank(message="First name cannot be blank") 
    * @Assert\Length(max=64, maxMessage="First name cannot more than {{ limit }} characters long") 
    */ 
    private $firstName; 

    ..... 

} 

現在我想輸出這些約束的形式有點像這樣。

<input type="text" required="required" data-required-msg="First name cannot be blank" name="firstname" data-max-length="64" data-max-length-msg="First name cannot be more than 64 characters long"> 

反正是有,我可以在Symfony的2,而無需手動創建這些消息和數據表格屬性再次做到這一點。

+0

似乎你想要做這樣的事情:http://stackoverflow.com/questions/15573935/symfony2-get-all-validation-constraints-on-an-entity-yml-xml-annotations –

回答

1

您可以使用以下代碼片段實現此目的。

這裏我注入一個驗證器服務來讀取一個類的元數據(註釋)。在我們的例子中,User類。然後在prepareConstraints函數中遍歷每個屬性約束並將它們添加到其屬性名稱爲key的數組。然後在buildForm函數中添加約束作爲字段attr的值。

在您constroller

$user = new User(); 
$form = $this->createForm(new UserType($this->get('validator'),$this->get('translator')), $user); 

在您UserType類:

class UserType extends AbstractType 
{ 
    private $metaData; 
    private $constraintMessages; 
    private $translator; 

public function __construct(ValidatorInterface $validatorInterface,TranslatorInterface $translator) 
{ 
    $this->metaData = $validatorInterface->getMetadataFor('AppBundle\Entity\User'); 
    $this->translator = $translator; 
    $this->prepareConstraints(); 
} 

private function prepareConstraints() 
{ 

    foreach ($this->metaData->properties as $property) { 
     foreach ($property->constraints as $constraint) { 
      $class = get_class($constraint); 
      $constraintName = substr($class, strrpos($class, '\\') + 1, strlen($class)); 
$message = property_exists($class, 'message') ? $constraint->message : $constraint->maxMessage;; 
      $this->constraintMessages[$property->name]['data-'.$constraintName] = $this->translator->trans($message,array('{{limit}}'=>...)) 
     } 
    } 
} 

/** 
* {@inheritdoc} 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'name', 
      null, 
      array(
       'label' => 'label.name', 
       'attr' => $this->constraintMessages['name'], 
      ) 
     ) 
     ... 
} 

}

結果

<input type="text" id="app_user_name" name="app_user[name]" required="required" data-notblank="This value should not be blank." class="form-control" value=""> 
+0

謝謝非常多的答覆。但是你的解決方案只能解決一半的問題。它不會格式化消息,也不會轉換消息。如果您仔細查看郵件中是否有需要填寫的佔位符{{limit}}。 – nicholasnet

+0

現在解決了問題,您可以根據需要調整翻譯服務, –