我正在尝试使用Symfony2和FosRestBundle构建一个简单的Restful-Service。
如果我使用GET
或POST
方法发送请求,则响应符合预期。
如果我使用PUT
或PATCH
方法,则结果为空。
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}
答案 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
且值为PUT
或PATCH
的隐藏输入字段。
您可以在以下两本食谱文章中阅读有关更改请求方法的更多信息: