我有这种特定形式,似乎没有返回生成错误的属性。通常,它应该返回一个键=>值对,并且它以另一种形式执行,但出于某种原因而不是这样做。
当表单数据有效时,表单会正确插入值。
此外,MiscServices.php中的代码也可以用于其他形式。
按照App \ Entity \ Address中的定义,它确实会为每个无效属性引发错误。
错误是:
警告:array_keys()期望参数1为数组,给出字符串
这是控制器,带有相应的代码。产生错误的行标记为// ***。为简洁起见,某些行被抑制了。
App \ Controller \ ApiAddressController
namespace App\Controller;
....
use App\Entity\Address;
use App\Form\AddressFormType;
use App\Service\MiscServices;
class ApiAddressController extends Controller
{
public function AddressAction( Request $request, MiscServices $miscServices )
{
$this->miscServices = $miscServices;
$em = $this->getDoctrine()->getManager();
$address = new Address();
$form = $this->createForm(AddressFormType::class, $address);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$address = $form->getData();
$address->getAddress3() == 'null' ? $address->setAddress3(NULL) : false;
$address->getState() == 'null' ? $address->setState(NULL) : false;
$em->persist($address);
$em->flush();
return new JsonResponse(array(
'status' => 'ok',
'address_id' => $address->getId(),
));
}
$errors = $this->miscServices->getErrorMessages($form)
$err_msg = array();
foreach( $errors as $key => $val ){
if( count(array_filter(array_keys($val), 'is_string')) > 0 ){ // *** this throws the error
foreach( $val as $key1 => $val1 ){
$err_msg[$key] = $val1[0];
}
}else{
$err_msg[$key] = $val[0];
}
}
return new JsonResponse(array(
'status' => 'error',
'errors' => $err_msg,
));
}
return $this->render('address.html.twig', array(
'form' => $form->createView(),
));
}
}
这是表单类型:
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\Address;
class AddressFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('address1', TextType::class)
->add('address2', TextType::class)
->add('address3', TextType::class)
->add('city', TextType::class)
->add('state', TextType::class)
->add('postal_code', TextType::class)
->add('save', SubmitType::class, array('label' => 'Submit'))
->getForm();
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Address::class,
));
}
}
App \ Service \ MiscServices
命名空间App \ Service;
类MiscServices {
public function getErrorMessages($form)
{
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$errors[] = $error->getMessage();
}
foreach ($form->all() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
return $errors;
}
}
谢谢