2015-10-19 19 views
1

我正在開發使用Symfony的有FOSRestBundle如何使用FormType和多對多的關係與FOSRestBuendle

從前端我有創建域和發送到與後續的格式與服務器的形式RESTful Web服務:

{"targets":[1,3],"title":"This is a title","price":1200000,"description":"This is a description"} 

密鑰targetsTargetField ID。隨着下面的代碼我得到狀態代碼500的響應說的foreach論證是無效的(見FieldType->buildForm()

/** 
* @ORM\Table(name="field") 
* @ORM\Entity 
*/ 
class Field extends Property { 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="FieldTarget") 
    * @ORM\JoinTable(name="relFieldTarget", 
    *  joinColumns={@ORM\JoinColumn(name="fieldId", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="fieldTargetId", referencedColumnName="id")} 
    *  ) 
    * */ 
    private $targets; 

    public function __construct() { 
     $this->targets = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function getTargets() { 
     return $this->targets; 
    } 
} 

FieldTarget

/** 
* @ORM\Table(name="fieldTarget") 
* @ORM\Entity 
*/ 
class FieldTarget 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string 
    * @ORM\Column(name="title", type="string") 
    **/ 
    private $title 
} 

的FieldType

class FieldType extends PropertyType { 

    private $manager; 

    function __construct(ObjectManager $manager){ 
     $this->manager = $manager; 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options)  { 
     parent::buildForm($builder, $options); 
     $builder 
      ->add('targets'); 

     $builder 
      ->get('targets') 
      ->addModelTransformer(new CallbackTransformer(
        function($fieldTargetIds) { // $fieldTargetIds is empty. WHY!? 
         $fieldTargetRepo = $this->manager->getRepository('FooBundle:FieldTarget'); 

         foreach($fieldTargetIds as $id){ 
          $fieldTarget[] = $fieldTargetRepo->find($id); 
         } 

         return $fieldTargets; // Here I'm tried hardcoding array($fieldTargetRepo->find(1)) and the field is created but is not related with the fieldTarget 1 
        }, 
        function() { 

        })); 
} 

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

} 

FieldController

/** 
* Create a Field entity. 
* 
* @View(statusCode=201, serializerEnableMaxDepthChecks=true) 
* 
* @param Request $request 
* 
* @return Response 
* 
*/ 
public function postAction(Request $request) { 
    $entity = new Field(); 
    $form = $this->createForm(new FieldType($this->getDoctrine()->getManager()), $entity, array("method" => $request->getMethod())); 
    $this->removeExtraFields($request, $form); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $entity; 
    } 

    return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR); 
} 

回答

0

你把代碼中的錯誤的功能。回調變換器中的第一個函數從模型轉換爲視圖,第二個函數從視圖轉換爲模型。在這種情況下,您正在嘗試爲第二個操作添加代碼。將您的代碼更改爲:

 ->addModelTransformer(new CallbackTransformer(
       function($fieldTargets) { 
        //TODO: code to transform from the model into the view 
       }, 
       function($fieldTargetIds) { 
        $fieldTargetRepo = $this->manager->getRepository('FooBundle:FieldTarget'); 

        foreach($fieldTargetIds as $id){ 
         $fieldTarget[] = $fieldTargetRepo->find($id); 
        } 

        return $fieldTargets; 
       })); 
+0

你是男人!我填滿了這麼愚蠢!謝謝!!!! :d –