Symfony 4表单错误不返回属性

时间:2018-06-26 13:31:41

标签: php forms symfony

我有这种特定形式,似乎没有返回生成错误的属性。通常,它应该返回一个键=>值对,并且它以另一种形式执行,但出于某种原因而不是这样做。

当表单数据有效时,表单会正确插入值。

此外,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;
} 
}

谢谢

0 个答案:

没有答案