Bạn có thể đạt được điều này bằng đoạn mã sau.
Ở đây tôi đang tiêm dịch vụ trình xác thực để đọc siêu dữ liệu (chú thích) của một lớp. Trong trường hợp của chúng tôi User
lớp học. Sau đó, trên prepareConstraints
chức năng lặp qua từng ràng buộc thuộc tính và thêm chúng vào một mảng có key
là tên thuộc tính. Sau đó, trên buildForm
chức năng thêm các ràng buộc dưới dạng giá trị trường attr
.
On constroller
$user = new User();
$form = $this->createForm(new UserType($this->get('validator'),$this->get('translator')), $user);
của bạn OnUserType
bạn lớp:
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'],
)
)
...
}
}
quả
<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="">
Nguồn
2015-11-10 15:16:32
Có vẻ như bạn muốn làm một việc như sau: http://stackoverflow.com/questions/15573935/symfony2-get-all-validation-constraints-on-an-entity-yml-xml-annotations –