Symfony PUT方法

时间:2014-04-12 06:47:00

标签: php symfony put

我希望通过PUT方法发送数据,我的控制器操作:

public function updateTestAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find(5);
    //$form = $this->createForm(new ProgressType(), $progress, array('method' => 'PUT'))->add('submit', 'submit');
    $form = $this->createForm(new ProgressType(), $progress)->add('submit', 'submit');

    $form->handleRequest($request);

    return $this->render('CodeCatsPanelBundle:Progress:test.html.twig', [
        'form' => $form->createView(),
        'valid' => $form->isValid(),
        'progress' => $progress,
        'request' => $request
    ]);
}

第一个表单工作正确,但当我将方法更改为PUT时,我收到验证错误:

  

此表单不应包含额外字段。

我知道Symfony2使用post和extra hidden field _method但是在这种情况下如何有效数据?

2 个答案:

答案 0 :(得分:1)

只需在模板中添加隐藏的输入,例如:

<form action='your route'>
  <input type='hidden' name='_method' value='PUT'>
  //do something.......
</form>

在你的行动中:

public function updateTestAction(Request $request)
{
   $em = $this->getDoctrine()->getManager();
   $progress = $em->getRepository('CodeCatsPanelBundle:Progress')->find(5);
   $form = $this->createForm(new ProgressType(), $progress)->add('submit', 'submit');

   $form->handleRequest($request);

   if ($form->isValid()){
     //do something
   }

   return $this->render('CodeCatsPanelBundle:Progress:test.html.twig', [
       'form' => $form->createView(),
       'valid' => $form->isValid(),//you need this? 
       'progress' => $progress,
       'request' => $request
   ]);
}
路径配置文件中的

 yourRouteName:
    path:      /path
    defaults:  { _controller: yourBundle:XX:updateTest }
    requirements: 
      _method: [PUT]

答案 1 :(得分:0)

  

大多数浏览器不支持通过发送PUT和DELETE请求   HTML表单中的method属性。

     

幸运的是,Symfony为您提供了一种简单的解决方法   这个限制。

Symfony 3

  1. 启用http-method-override
  2. web/app.php

    Request::enableHttpMethodParameterOverride(); // add this line
    
    1. 选择以下覆盖之一:
    2. 在树枝模板中

      {# app/Resources/views/default/new.html.twig #}
      {{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}
      

      在表格中

      form = $this->createForm(new TaskType(), $task, array(
          'action' => $this->generateUrl('target_route'),
          'method' => 'GET',
      ));
      

      在控制器中/懒惰的方式

      $form = $this->createFormBuilder($task)
          ->setAction($this->generateUrl('target_route'))
          ->setMethod('GET')
          ->add('task', 'text')
          ->add('dueDate', 'date')
          ->add('save', 'submit')
          ->getForm();
      

      Post-Symfony 2.2

      与上述相同,只是步骤2,默认情况下完成第1步。

      Pre-Symfony 2.2

      与上述步骤1和2相同。

      参考