2016-04-30 5 views
9

Ich entwickle eine Symfony 2.6.1 Anwendung validieren, und ich habe eine Form, ich mit dem FormTypes und einer Entität mit Anmerkungen als Validierungs machen. Das Formular sendet einen AJAX POST-Aufruf an einen FOSRestController. Die Sache ist die isValid() Funktion zurückkehrt FALSCH und ich erhalte keine Fehlermeldungen ...Symfony2 des FOSRestController kann nicht eine Ajax-Post-Anforderung

Mein FOSRestController sieht wie folgt aus:

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-Klasse unter:

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

Die GalleryType , das Formular einkapselnd:

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

Schließlich in meinem ap p/config/config.yml wird die Validierung wie folgt festgelegt:

validation:  { enable_annotations: true } 

den Validierungsfehler bekommen ich auch mit der folgenden Funktion versucht haben, ohne Erfolg:

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:

Wenn ich manuell einen Validator verwenden, funktioniert es:

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

Es ist also so, als hätte mein GalleryType den Validator nicht benutzt.

+0

Haben Sie Ihre Protokolle überprüft? Wenn Ihr Formular den Validator überhaupt nicht verwendet hat, erhalten Sie einen Fehler, weil '$ name' nicht' null' sein kann. Du hast "Gültig" nicht bekommen? –

+0

Können Sie versuchen, die Zeile zu ersetzen, in der Sie das Formular in Ihrem Controller erstellen: '$ this-> container-> get ('form.factory') -> createNamed ('', new \ Law \ AdminBundle \ Form \ Typ \ GalleryType(), $ gallery); ' –

+0

Hat meine Antwort Ihr Problem gelöst? –

Antwort

1

Dies liegt daran, Sie handleRequest mit leeren übermittelten Daten verwenden, denke ich. In einem solchen Szenario, das Sie solche Aufruf:

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

als handleRequest wird auto-Formular senden, es sei denn ein Feld vorhanden ist. Wenn Sie die Anfrage mit leerem array Formular bearbeiten, wird isValidfalse ohne Fehler zurückgegeben.

Hinweis: wenn Sie leer POST Array oder so etwas wie senden:

`Gallery` => [] 

Wenn Sie leer Gallery Array alles senden sollte wie erwartet funktionieren.

Können Sie Daten einfügen, die Sie über AJAX Anfrage senden?

Verwandte Themen