[英]PUT request not working with Symfony forms and FosRest
我正在嘗試使用FosRest和Symfony表單在Symfony中為用戶管理編寫一個簡單的restful控制器。 我的應用程序由Amazon DynamoDB支持,盡管我認為不重要。
我有DELETE,GET和POST(新用戶)都完美無缺。
我現在來寫PUT動作(編輯用戶)似乎不起作用。 我花了很多年頭撞在磚牆上,我無法解決這個問題。
為了創建PUT,我基本上復制了POST操作,但是修改它以首先加載舊對象。
在POST中,User對象自動由$ form-> handleRequest($ request)行填充;
這似乎不適用於PUT操作,用戶對象不會被填充/修改。 我檢查了$ _REQUEST數組,並且正在提交數據。 由於缺少對PUT的瀏覽器支持,我通過使用查詢參數_method = PUT對數據執行POST來調用操作(對DELETE工作正常,並且它將路由到正確的位置)。
這是我的POST動作有效:
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控制器沒有:
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頻道的一些幫助之后,事實證明這不起作用的原因是這部分代碼:
$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表單 - 無需手動執行任何操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.