2016-04-30 12 views
9

Pracuję nad aplikacją Symfony 2.6.1 i mam formularz renderowany za pomocą FormTypes i Entity przy użyciu adnotacji jako sprawdzania poprawności. Formularz jest przesyłany do wywołania AJAX POST do kontrolera FOSRestController. Rzecz jest funkcja isValid() zwraca FAŁSZ i otrzymuję żadnych komunikatów o błędach ...Symulator FOSRestController symfony2 nie może sprawdzić poprawności żądania ajaxowego

My FOSRestController wygląda następująco:

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; 
    } 
klasy poniżej

mojej galerii Podmiot:

<?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; 
    } 
} 

GalleryType , enkapsulacja formularza:

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'; 
    } 
} 

Wreszcie, w moim ap p/config/config.yml, walidacja jest skonfigurowana w następujący sposób:

validation:  { enable_annotations: true } 

Aby uzyskać błąd sprawdzania poprawności Mam również próbował z następujących funkcji bezskutecznie:

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:

Gdybym ręcznie używać walidatora, to działa:

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

To tak, jakby mój GalleryType nie korzystał z walidatora.

+0

Czy sprawdziłeś logi? Jeśli twój formularz w ogóle nie używał walidatora, dostaniesz błąd, ponieważ '$ name' nie może mieć wartości' null'. Nie dostałeś "Is Valid!"? –

+0

Czy możesz spróbować zastąpić wiersz, w którym tworzysz formularz w swoim kontrolerze: '$ this-> container-> get ('form.factory') -> createNamed ('', new \ Law \ AdminBundle \ Form \ Wpisz \ GalleryType(), $ gallery); ' –

+0

Czy moja odpowiedź rozwiązała Twój problem? –

Odpowiedz

1

Jest tak, ponieważ używasz handleRequest z pustymi przesłanymi danymi, jak sądzę. W takim scenariuszu ty takie wezwanie:

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

jak handleRequest zostanie automatycznie przesłać formularz chyba jedno pole jest obecny. Podczas obsługi żądania z pustym formularzem array formularz nie jest wysyłany, dlatego isValid zwraca false bez błędów.

Uwaga: sprawdź czy jesteś wysyłając pustego POST tablicę lub coś takiego:

`Gallery` => [] 

Jeśli wysyłasz pusty Gallery tablicy wszystko powinno działać zgodnie z oczekiwaniami.

Czy możesz wkleić dane, które wysyłasz, wysyłając żądanie przez AJAX?

Powiązane problemy