FosRestBundele PUT方法不适用于Forms,但POST或GET工作正常

时间:2015-07-05 18:27:33

标签: php rest symfony fosrestbundle

我正在尝试使用Symfony2和FosRestBundle构建一个简单的Restful-Service。

如果我使用GETPOST方法发送请求,则响应符合预期。

如果我使用PUTPATCH方法,则结果为空。

FormType     

namespace MobileService\UserBundle\Form;

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

class CurrentLocationType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('latitude')
        ->add('longitude')
        ->add('city')
        ->add('zip')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MobileService\UserBundle\Entity\CurrentLocation',
        'csrf_protection' => false
    ));
}

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

我的控制器的putAction($id)postAction($id)完全相同。

控制器/动作

public function putAction($id)
{
    $request = $this->getRequest();
    $method=$request->getMethod();

    $em = $this->getDoctrine()->getManager();
    $location = $em->getRepository('MobileServiceUserBundle:CurrentLocation')->find($id);

    $form = $this->createForm(new CurrentLocationType(), $location, array('method' => $method));
    $form->submit($request, false);

    if ($form->isValid()) {
        $em->persist($location);
        $em->flush();
    }
    else die('Invalid form.');

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

PUT请求的结果:

{"location":{"id":1,"latitude":0,"longitude":0,"city":"","zip":0}}

POST请求的结果:

{"location":{"id":1,"latitude":51.4681,"longitude":6.9174,"city":"Essen","zip":451361}}

控制台路由的输出:debug

new_profiles                      GET    ANY    ANY  /profiles/new.{_format}           
get_profiles                      GET    ANY    ANY  /profiles/{id}.{_format}          
get_locations                     GET    ANY    ANY  /locations.{_format}              
get_location                      GET    ANY    ANY  /locations/{id}.{_format}         
post_locations                    POST   ANY    ANY  /locations.{_format}              
put_location                      PUT    ANY    ANY  /locations/{id}.{_format}         
get_images                        GET    ANY    ANY  /images.{_format}   

2 个答案:

答案 0 :(得分:2)

由于您知道您的请求将成为PUT请求,因此使用以下内容似乎很愚蠢:

  $method=$request->getMethod();

而是尝试使用它:

  $method= 'PUT';

此外,$ request对象应该作为操作中的参数传递,而不是从请求对象中检索它,而不是使用它:

$form->submit($request, false);

你应该用这个:

$form->handleRequest($request);

总结一下,我将使用的代码是:

public function putAction($id, Request $request)
{
    $method='PUT';

    $em = $this->getDoctrine()->getManager();
    $location = $em->getRepository('MobileServiceUserBundle:CurrentLocation')->find($id);

    $form = $this->createForm(new CurrentLocationType(), $location, array('method' => $method));
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em->persist($location);
        $em->flush();
    }
    else die('Invalid form.');

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

不要忘记Request对象的正确使用声明。

答案 1 :(得分:0)

并非所有浏览器都支持PUT | PATCH | DELETE个请求。

即使表单中包含POST,他们通常也会发送method="PUT"请求。

<强>解决方案:

Symfony针对这种情况提供了一个简单的解决方法。

在表单中添加名为_method且值为PUTPATCH的隐藏输入字段。

您可以在以下两本食谱文章中阅读有关更改请求方法的更多信息: