2014-04-11 13 views
10

Uygulama REST api ang AngularJS temel alınarak oluşturmaya çalışıyorum. Bu dersi http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html takip ettim, ancak bazı detayları (amorti edilmiş yöntemler) değiştirmek zorundayım ve şu anda 'Bu form ek alanlar içermemeli' yeni bir varlık oluşturmak için gönderdiğimde. Symfony2.4 form 'Bu form ek alanlar içermemelidir' hatası

class MainController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     $form = $this->createForm(new TaskType(),null,array('action' => $this->generateUrl('post_tasks').'.json')) 
       ->add('submit','submit'); 


     $note_form = $this->createForm(new NoteType()) 
       ->add('submit','submit'); 

     return $this->render('MyBundle:Main:index.html.twig', 
       array(
        'form'=>$form->createView(), 
        'note_form'=>$note_form->createView(), 
       ) 
     ); 
    } 
} 

benim TaskType formu:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 

      ->add('timeStart','datetime',array(
       'date_widget' => 'single_text', 
       'time_widget' => 'single_text', 
       'date_format' => 'yyyy-MM-dd', 
       'data' => new \DateTime('now') 
      )) 

      ->add('timeStop','datetime',array(
       'date_widget' => 'single_text', 
       'time_widget' => 'single_text', 
       'date_format' => 'yyyy-MM-dd', 
       'data' => new \DateTime('now') 
      )) 

      ->add('project') 
      ->add('descriptionTask') 
      ->add('isCompleted',null,array('required' => false)) 
      ->add('isVisible',null,array('required' => false)) 
     ; 
    } 
şu anda benim görünümünde ben TEST AŞAMASINDA İSTİYORUM tek biçim AMA render ediyorum

:

{%extends 'MyBundle::layout.html.twig' %} 

{%block content %} 

<div ng-view></div> 

{{ form(form) }} 

{% endblock %} 

VE bu verilen varlığın gömülmesi gereken REST denetleyicisidir:

public function cpostAction(Request $request) 
{ 
$entity = new Task(); 
$form = $this->createForm(new TaskType(), $entity); 
$form->handleRequest($request); 

if ($form->isValid()) { 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 

    return $this->redirectView(
      $this->generateUrl(
       'get_organisation', 
       array('id' => $entity->getId()) 
       ), 
      Codes::HTTP_CREATED 
      ); 
} 

return array(
    'form' => $form, 
); 
} 

garip şey: ... Ben MainController için DİNLENME denetleyicisinden aynı kodu koyduğunuzda, o formu ve yeni bir varlık doğrulandığında kızarmış ediliyor, ama bir şekilde DİNLENME denetleyici hatası atar

cevap

11

Onun üreten çünkü eklediğiniz form gönderme düğmeleri ancak bunları doğruladığınızda değilsiniz. deneyin:

public function cpostAction(Request $request) 
{ 
    $entity = new Task(); 
    $form = $this->createForm(new TaskType(), $entity)->add('submit','submit'); 
    ... 

düğme teknik symfony alışkanlık varsayılan bir varlık özelliğine eşlemek rağmen bir alandır gönderin. Bu nedenle, bir gönder düğmesiyle formu oluşturduğunuzda ve bu formu, doğrulama denetleyicinizin işleminde oluşturduğunuz formun gönderilip gönderilmesinin de bir gönderme düğmesinin olması gerekir.

+0

Çok teşekkür ederim! – mmmm

+0

Çözüm için çok teşekkürler. Form işleyicilerimin her birinde bunu yapmamı gerektirmeyen bir çözüm olup olmadığını biliyor musunuz? – Jonathan

+1

Evet, yazının sonuna eklemeler eklemek yerine Evet eklerini ekleyin – Chausser

4

Eğer devre dışı alanlar doğrulama istiyorsan,

public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'csrf_protection' => false, 
     'validation_groups' => false, 
    )); 
} 

eklemelisiniz Ve buildForm yönteminde: Daha fazla ayrıntı için

public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) { 
      $event->stopPropagation(); 
     }, 900); 
     $builder->add('field1','text') 
       ->add('field2','text') 
       . 
       . 
       . 
    } 

: İsterseniz http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation

+5

Csrf'yi devre dışı bırakmanın korkunç, korkunç bir güvenlik uygulaması olduğunu unutmayın. Şanslar her zaman problemi ele almak için daha iyi bir yol var. – csvan

+1

@csvan Ayrıca dinlenmeyen API için de uygun değildir –

14

doğrulayıcı ek görmezden alanları, FormBuilder'a bir seçenek olarak 'allow_extra_fields' => true'u geçmeyi denemeniz gerekir.

+4

Not: 'allow_extra_fields' seçeneği Symfony v2.6'ya eklendi – biphobe

İlgili konular