我正在尝试使用FosRest和Symfony表单在Symfony中编写一个用于用户管理的简单静态 Controller 。我的应用程序由Amazon DynamoDB支持,尽管我认为这并不重要。
我的DELETE,GET和POST(新用户)都正常运行。
我现在开始编写似乎无效的PUT操作(编辑用户)。我花了很长时间才把头撞在砖墙上,但我无法解决。
为了创建PUT,我实质上复制了POST操作,但对其进行了修改以首先加载旧对象。
在POST中,通过$ form-> handleRequest($ request)行自动填充User对象;
这似乎在PUT操作中不起作用,用户对象未填充/修改。我已经检查了$ _REQUEST数组,并且正在提交数据。由于缺乏浏览器对PUT的支持,我通过对查询参数_method = PUT进行数据的POST(这对于DELETE很好,并且可以路由到正确的位置)来调用该操作。
这是我有效的POST Action :
public function postUsersAction(Request $request)
{
$user = new User();
$user->setTable($this->getTable());
$formBuilder = $this->createFormBuilder($user, array(
'validation_groups' => array('registration', '')))
->add('username', 'text')
->add('password', 'password')
->setAction($this->generateUrl('post_users'))
->setMethod('POST')
->setAttribute('validation_groups', array('registration'));
$roles = $this->getFlattenedRoles($this->getRoles());
$formBuilder->add('roles', 'choice', array(
'choices' => $roles,
'multiple' => true,
'expanded' => true
));
$form = $formBuilder->add('save', 'submit')->getForm();
$form->handleRequest($request);
if ($form->isValid())
{
$user->save();
$params = array('user' => $user);
$view = $this->view($params, 200)
->setTemplate("MyRestBundle:User:newconfirm.html.twig");
return $this->handleView($view);
}
$params = array('form' => $form, 'user' => $user);
$view = $this->view($params, 400)
->setTemplate("MyRestBundle:User:new.html.twig");
return $this->handleView($view);
}
这是我的PUT Controller 没有的:
public function putUserAction($slug, Request $request)
{
$table = $this->getTable();
$user = $table->load($slug);
$formBuilder = $this->createFormBuilder($user)
->add('password', 'password')
->setAction($this->generateUrl('put_user', array('slug' => $slug, '_method' => 'PUT')))
->setMethod('POST');
$roles = $this->getFlattenedRoles($this->getRoles());
$formBuilder->add('roles', 'choice', array(
'choices' => $roles,
'multiple' => true,
'expanded' => true
));
$form = $formBuilder->add('save', 'submit')->getForm();
$form->handleRequest($request);
if ($form->isValid())
{
$user->save();
$params = array('user' => $user);
$view = $this->view($params, 200)
->setTemplate("MyRestBundle:User:newconfirm.html.twig");
return $this->handleView($view);
}
$params = array('form' => $form, 'user' => $user);
$view = $this->view($params, 400)
->setTemplate("MyRestBundle:User:new.html.twig");
return $this->handleView($view);
}
任何帮助将不胜感激。
最佳答案
好的,在Symfony IRC channel 中获得一些帮助之后,事实证明这是无效的原因是代码的以下部分:
$formBuilder = $this->createFormBuilder($user)
->add('password', 'password')
->setAction($this->generateUrl('put_user', array('slug' => $slug, '_method' => 'PUT')))
->setMethod('POST');
由于PUT在许多浏览器中均不起作用,因此我试图将方法设置为POST,并将_method = PUT作为查询参数传递,以覆盖真实的HTTP方法。事实证明,没有必要这样做,Symfony会为您处理所有这一切。上面的代码现在就是:
$formBuilder = $this->createFormBuilder($user)
->add('password', 'password')
->setAction($this->generateUrl('put_user', array('slug' => $slug))
->setMethod('PUT');
通过这样做,Symfony实际上呈现了带有隐藏的_method字段的POST表单-无需手动执行任何操作。
关于php - PUT请求不适用于Symfony表单和FosRest,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20633108/