2015-12-07 2 views
0

У меня есть 3 типа форм (SearchForm - SearchField - SearchFieldType), каждый из которых включает следующий так:Symfony: не удалось обработать запрос в форме

SearchFormType:

<?php 

namespace AppBundle\Form; 

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

class SearchFormType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('fields', 'collection', array('type' => new SearchFieldType(), 
                'allow_add' => true, 
                'allow_delete' => true, 
                'by_reference' => false)) 
      ->add('submit', 'submit', array('label' => "Buscar")) 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\SearchForm', 
      'allow_extra_fields' => true, 
      'csrf_protection' => false, 
      'validation_groups' => false, 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_searchform'; 
    } 
} 

SearchFieldType:

<?php 

namespace AppBundle\Form; 

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

class SearchFieldType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', 'hidden') 
      ->add('slug', 'hidden') 
      ->add('value') 
      ->add('choices') 
      ->add('type', new SearchFieldTypeType()) 
      ->add('actionFilter') 
      ->add('actionHighlight') 
      ->add('actionShow') 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\SearchField' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_searchfield'; 
    } 
} 

SearchFieldTypeType

<?php 

namespace AppBundle\Form; 

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

use AppBundle\Entity\SearchOperator; 

class SearchFieldTypeType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $entity = $builder->getData(); 

     $builder 
      ->add('name', 'hidden') 
      ->add('operators', 'entity', array('class' => 'AppBundle:SearchOperator', 
               'multiple' => false, 
               'expanded' => false)) 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\SearchFieldType' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_searchfieldtype'; 
    } 
} 

форма делает правильно, но когда я представить и попытаться сделать $form->handleRequest($request) я получаю исключение:

Ни собственности «операторы», ни один из методов «addOperator()»/"removeOperator ()», "setOperators()", "операторы()", "__set()" или "__call()" существуют и имеют открытый доступ в классе "AppBundle \ Entity \ SearchFieldType"

Это не так на самом деле , поскольку эти методы существуют и работают правильно:

AppBundle\Entity\SearchFieldType:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use AppBundle\Entity\SearchOperator; 
/** 
* SearchField 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class SearchFieldType 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=100, nullable=true) 
    */ 
    private $name; 

    /** 
    * @ORM\ManyToMany(targetEntity="SearchOperator", cascade={"persist", "remove"}) 
    * @ORM\JoinTable(
    *  joinColumns={@ORM\JoinColumn(name="type_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="operator_id", referencedColumnName="id")} 
    *  ) 
    **/ 
    private $operators; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->operators = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * @return SearchFieldType 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

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

    /** 
    * Add operator 
    * 
    * @param SearchOperator $operator 
    * 
    * @return SearchFieldType 
    */ 
    public function addOperator(SearchOperator $operator) 
    { 
     $this->operators[] = $operator; 

     return $this; 
    } 

    /** 
    * Remove operator 
    * 
    * @param SearchOperator $operator 
    */ 
    public function removeOperator(SearchOperator $operator) 
    { 
     $this->operators->removeElement($operator); 
    } 

    /** 
    * Get operator 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getOperators() 
    { 
     return $this->operators; 
    } 

    public function __toString() 
    { 
     return $this->name; 
    } 

} 

Stack trace:

in vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php at line 460 + 
at PropertyAccessor ->writeProperty (object(SearchFieldType), 'operators', object(SearchOperator)) 
in vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php at line 104 + 
at PropertyAccessor ->setValue (object(SearchFieldType), object(PropertyPath), object(SearchOperator)) 
in vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php at line 93 + 
at PropertyPathMapper ->mapFormsToData (object(RecursiveIteratorIterator), object(SearchFieldType)) 
in vendor/symfony/symfony/src/Symfony/Component/Form/Form.php at line 633 + 
at Form ->submit (array('operators' => '156', 'name' => 'string'), true) 
in vendor/symfony/symfony/src/Symfony/Component/Form/Form.php at line 577 + 
at Form ->submit (array('type' => array('operators' => '156', 'name' => 'string'), 'value' => 'felipe', 'name' => 'Nombre', 'slug' => 'nombre'), true) 
in vendor/symfony/symfony/src/Symfony/Component/Form/Form.php at line 577 

EDIT:

Controller Code:

 $searchFormEntity = new SearchForm(); 
     $searchFormWithValues = $this->createForm(new SearchFormType(), $searchFormEntity, array(
             'action' => $this->generateUrl('candidato'), 
             'method' => 'POST' 
            )); 
     $searchFormWithValues->add('submit', 'submit', array('label' => 'Buscar')); 
     $searchFormWithValues->handleRequest($request); 
+0

Вы правильно задали пространства имен и 'use'-предложения в каждом классе? Где вы определили 'data_class' для своих форм? Вы очистили свой кеш? Кэш APC/OpCode? –

+0

@MichaelSivolobov Я добавил некоторый код контроллера в OP и другие функции 'SearchFieldTypeType'. Я думаю, что использование утверждений и других вещей, которые вы задаете, настроены правильно (да, я также очистил кеш). Форма отображается правильно, и проблема возникает только при попытке обработать запрос. Может быть, есть внутренняя путаница с именами? Существует тип «SearchFieldType», тип формы «SearchFieldType» и тип формы «SearchFieldTypeType». Если я добавлю 'use AppBundle \ Entity \ SearchFieldType' внутри' SearchFieldTypeType', я получаю сообщение об ошибке. –

+0

Я думаю, что ошибка в 'use' и namespaces. Отправьте его. –

ответ

0

Ну у вас есть ManyToMany отношение, так что Wou ld имеет смысл, чтобы поле operators было коллекцией. Однако вы определили его как сущность, так что теперь форма будет иметь методы setOperators и getOperators, так как entity подразумевает отношения ManyToOne или OneToOne. Я думаю, вам нужно изменить инструкцию в классе SearchFieldTypeType, где добавление атрибута operators будет таким же, как и ранее, для fields в SearchFormType, если вы хотите сохранить отношения ManyToMany.

+0

, что решает проблему, но то, что я действительно хочу, это выпадающий список со всеми доступными операторами, мне не нужно добавлять новые, как описано [здесь] (http://stackoverflow.com/questions/34133664/symonfy-form-type-restrict-entity -field-options-to-associated-values), где вы также ответили :-) –

+0

Думаю, нам нужно отметить это как дублирующее, то или другое. – anegrea

+0

Я все еще не уверен, что вы пытаетесь фильтровать. Вы уверены, что хотите иметь отношения ManyToMany? (Это не обычно представлено выпадающим списком, но может быть сделано как таковое из js) – anegrea

Смежные вопросы