Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用FormType和与FOSRestBuendle的多个关系_Php_Symfony_Fosrestbundle - Fatal编程技术网

Php 如何使用FormType和与FOSRestBuendle的多个关系

Php 如何使用FormType和与FOSRestBuendle的多个关系,php,symfony,fosrestbundle,Php,Symfony,Fosrestbundle,我正在使用Symfony和FOSRestBundle开发一个RESTful web服务 从前端我有一个表单,它创建字段并以以下格式发送到服务器: {"targets":[1,3],"title":"This is a title","price":1200000,"description":"This is a description"} 键targets具有TargetFieldid。使用下面的代码,我得到一个状态代码为500的响应,表示foreach参数无效(请参见FieldType->b

我正在使用Symfony和FOSRestBundle开发一个RESTful web服务

从前端我有一个表单,它创建字段并以以下格式发送到服务器:

{"targets":[1,3],"title":"This is a title","price":1200000,"description":"This is a description"}
targets
具有
TargetField
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
}
字段类型

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

}
现场控制器

/**
 * 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);
}

您将代码放在了错误的函数中。回调转换器中的第一个函数从模型转换到视图,第二个函数从视图转换到模型。在本例中,您尝试为第二个操作添加代码。将代码更改为:

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

您将代码放在了错误的函数中。回调转换器中的第一个函数从模型转换到视图,第二个函数从视图转换到模型。在本例中,您尝试为第二个操作添加代码。将代码更改为:

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