2016-04-30 13 views
9

Tôi đang phát triển một ứng dụng Symfony 2.6.1 và tôi có một biểu mẫu tôi kết xuất với FormTypes và một thực thể bằng cách sử dụng chú thích làm xác thực. Biểu mẫu được gửi một cuộc gọi AJAX POST tới một FOSRestController. Vấn đề là các isValid() hàm được trở về FALSE và tôi không nhận được thông báo lỗi ...FOSRestController của symfony2 không thể xác nhận yêu cầu đăng bài ajax

My FOSRestController trông như sau:

class RestGalleryController extends FOSRestController{ 

    /** 
    * @Route(requirements={"_format"="json"}) 
    */ 
    public function postGalleriesAction(\Symfony\Component\HttpFoundation\Request $request){ 

     return $this->processForm(new \Law\AdminBundle\Entity\Gallery()); 
    } 
    private function processForm(\Law\AdminBundle\Entity\Gallery $gallery){ 

     $response = array('result' => 'Default'); 

     $gallery->setName('TEST'); //Just added this to be sure it was a problem with the validator 
     $form = $this->createForm(
      new \Law\AdminBundle\Form\Type\GalleryType(), 
      $gallery 
     ); 
     $form->handleRequest($this->getRequest()); 

     if ($form->isValid()) { 

      $response['result'] = 'Is Valid!'; 
     }else{ 
      var_dump($form->getErrorsAsString()); 
      die;   
     } 
     return $response; 
    } 

My Gallery Entity lớp dưới đây:

<?php 

namespace Law\AdminBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Gallery 
* 
* @ORM\Table(name="gallery") 
* @ORM\Entity 
*/ 
class Gallery{ 

    /** 
    * @var string 
    * @Assert\NotBlank() 
    * @ORM\Column(name="name", type="text", nullable=false) 
    */ 
    private $name; 

    public function __construct(){ 
     $this->images = new ArrayCollection(); 
    } 
    /** 
    * Set name 
    * 
    * @param string $name 
    * @return Gallery 
    */ 
    public function setName($name){ 
     $this->name = $name; 

     return $this; 
    } 
    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName(){ 
     return $this->name; 
    } 
} 

các GalleryType , đóng gói biểu mẫu:

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class GalleryType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder->add('name'); 
    } 
    /** 
    * {@inheritdoc} 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => 'Law\AdminBundle\Entity\Gallery', 
      'csrf_protection' => false, 
     )); 
    } 
    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'Gallery'; 
    } 
} 

Cuối cùng, trong ap của tôi p/config/config.yml, việc phê chuẩn được thiết lập như sau:

validation:  { enable_annotations: true } 

Để có được xác nhận lỗi Tôi cũng đã thử với các chức năng sau đây, không thành công:

private function getErrorMessages(\Symfony\Component\Form\Form $form) { 
    $errors = array(); 

    foreach ($form->getErrors() as $key => $error) { 
     if ($form->isRoot()) { 
      $errors['#'][] = $error->getMessage(); 
     } else { 
      $errors[] = $error->getMessage(); 
     } 
    } 

    foreach ($form->all() as $child) { 
     if (!$child->isValid()) { 
      $errors[$child->getName()] = $this->getErrorMessages($child); 
     } 
    } 

    return $errors; 
} 

EDIT:

Nếu tôi tự sử dụng một validator, nó hoạt động:

$formGallery = new Gallery(); 
    $formGallery->setName($this->getRequest()->get('name', NULL)); 
    $validator = $this->get('validator'); 
    $errors = $validator->validate($formGallery); 

Vì vậy, nó giống như bằng cách nào đó GalleryType của tôi đã không sử dụng trình xác nhận hợp lệ.

+0

Bạn đã kiểm tra nhật ký của mình chưa? Nếu biểu mẫu của bạn không sử dụng trình duyệt tính hợp lệ, bạn sẽ gặp lỗi vì '$ name' không thể là' null'. Bạn đã không nhận được 'Có hiệu lực!'? –

+0

Bạn có thể thử thay thế dòng mà bạn tạo biểu mẫu trong bộ điều khiển của bạn với điều này: '$ this-> container-> get ('form.factory') -> createNamed ('', new \ Law \ AdminBundle \ Form \ Loại \ GalleryType(), $ gallery); ' –

+0

Câu trả lời của tôi có giải quyết được vấn đề của bạn không? –

Trả lời

1

Điều này là do bạn đang sử dụng handleRequest với dữ liệu đã gửi trống tôi đoán. Trong trường hợp như vậy, bạn gọi như vậy:

// remove form->handleRequest call 
// $form->handleRequest($this->getRequest()); 
$form->submit($request->request->all()); 

handleRequest sẽ tự động gửi biểu mẫu trừ khi có một trường. Khi bạn xử lý yêu cầu với biểu mẫu trống rỗng array không được gửi, đó là lý do tại sao isValid trả về false mà không có lỗi.

Lưu ý: kiểm tra nếu bạn đang gửi rỗng POST mảng hoặc một cái gì đó như:

`Gallery` => [] 

Nếu bạn đang gửi rỗng mọi thứ Gallery mảng nên làm việc như mong đợi.

Bạn có thể dán dữ liệu bạn đang gửi qua yêu cầu AJAX không?

Các vấn đề liên quan