OK các bạn, tôi có cách khác. Nó phức tạp hơn và chỉ dành cho những trường hợp cụ thể.
Trường hợp của tôi:
Tôi có một biểu mẫu và sau khi gửi, tôi đăng dữ liệu lên máy chủ API. Và lỗi tôi cũng nhận được từ máy chủ API.
Định dạng lỗi máy chủ API là:
array(
'message' => 'Invalid postal code',
'propertyPath' => 'businessAdress.postalCode',
)
Mục tiêu của tôi là có được giải pháp linh hoạt. Hãy đặt lỗi cho trường tương ứng.
$vm = new ViolationMapper();
$error['propertyPath'] = 'children['. str_replace('.', '].children[', $error['propertyPath']) .']';
$constraint = new ConstraintViolation(
$error['message'], $error['message'], array(), '', $error['propertyPath'], null
);
$vm->mapViolation($constraint, $form);
Đó là nó!
GHI CHÚ! addError()
phương thức bỏ qua tùy chọn error_mapping .
Biểu mẫu của tôi (Biểu mẫu địa chỉ được nhúng trong Biểu mẫu công ty):
Công ty
<?php
namespace Acme\DemoBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;
class Company extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('companyName', 'text',
array(
'label' => 'Company name',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
->add('businessAddress', new Address(),
array(
'label' => 'Business address',
)
)
->add('update', 'submit', array(
'label' => 'Update',
)
)
;
}
public function getName()
{
return null;
}
}
Địa chỉ
<?php
namespace Acme\DemoBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;
class Address extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('postalCode', 'text',
array(
'label' => 'Postal code',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
->add('town', 'text',
array(
'label' => 'Town',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
->add('country', 'choice',
array(
'label' => 'Country',
'choices' => $this->getCountries(),
'empty_value' => 'Select...',
'constraints' => array(
new Constraints\NotBlank()
),
)
)
;
}
public function getName()
{
return null;
}
}