php – Symfony2 FOSRestBundle PUT Action FORM返回空结果

前端之家收集整理的这篇文章主要介绍了php – Symfony2 FOSRestBundle PUT Action FORM返回空结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Symfony 2.2和最新版本的FOSRestBundle.所以我设法让大多数动作都能正常工作,但我似乎对FormBuilder有一个问题,即我正在传递PUT请求的请求.

我检查了请求对象,它来自我的Backbone.je模型​​,因为它应该(.save())但是在绑定到表单后,实体返回只有id导致flush()抛出错误,因为必需的字段没有填补.

控制器中的操作:

header('Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS ');
header('Allow GET,OPTIONS ');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type,*');

use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\Rest\Util\Codes;
use Symfony\Component\HttpFoundation\Request;
use Greenthumbed\ApiBundle\Entity\Container;
use Greenthumbed\ApiBundle\Form\ContainerType;

class ContainerController extends FOSRestController implements ClassResourceInterface
{
/**
 * Put action
 * @var Request $request
 * @var integer $id Id of the entity
 * @return View|array
 */
public function putAction(Request $request,$id)
{
    $entity = $this->getEntity($id);
    $form = $this->createForm(new ContainerType(),$entity);
    $form->bind($request);

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

        return $this->view(null,Codes::HTTP_NO_CONTENT);
    }

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

/**
 * Get entity instance
 * @var integer $id Id of the entity
 * @return Container
 */
protected function getEntity($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('GreenthumbedApiBundle:Container')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Container entity');
    }

    return $entity;
}

被称为的表格:

namespace Greenthumbed\ApiBundle\Form;

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

class ContainerType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ->add('name')
            ->add('description')
            ->add('isVisible')
            ->add('type')
            ->add('size')
            ->add('creationDate')
            ->add('userId')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Greenthumbed\ApiBundle\Entity\Container','csrf_protection' => false,));
    }

    public function getName()
    {
        return 'greenthumbed_apibundle_containertype';
    }
}

到目前为止,我已经尝试了所有内容,但我对Symfony相当新,我无法理解为什么$实体不包含请求收到的值.

仅供参考:我尝试过手动操作,例如在实例化带有请求ID的Container类,并使用setter将值输入到它中并且它工作得很好,我只是想以正确的方式做事情,因为Symfony建议它应该完成.

非常感谢你提前.

尝试更改putAction中的以下行:
$form = $this->createForm(new ContainerType(),$entity);

至:

$form = $this->createForm(new ContainerType(),$entity,array('method' => 'PUT'));

猜你在找的PHP相关文章