Почему я должен использовать x-www-form-urlencoded
вариант, когда я пытаюсь проверить метод PUT в Zend Framework 2 на Почтальоне?
/*
Use multipart/form-data for testing.
*/
public function create($data)
{
$form = new AlbumForm();
$album = new Album();
$form->setInputFilter($album->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
$album->exchangeArray($form->getData());
$id = $this->getAlbumTable()->saveAlbum($album);
}
return new JsonModel(array(
'data' => $album->extract(),
));
}
/*
Use application/x-www-form-urlencoded for testing.
*/
public function update($id, $data)
{
$data['id'] = $id;
$album = $this->getAlbumTable()->getAlbum($id);
$form = new AlbumForm();
$form->bind($album);
$form->setInputFilter($album->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
$id = $this->getAlbumTable()->saveAlbum($form->getData());
}
return new JsonModel(array(
'data' => $album->extract(),
));
}
Я получу этот результат, если я получил за form-data
вариант,
Array
(
[------WebKitFormBoundaryP9erwzQtIaB0m0tr
Content-Disposition:_form-data;_name] => "title"
bla bla bla bla xxx
------WebKitFormBoundaryP9erwzQtIaB0m0tr
Content-Disposition: form-data; name="artist"
xxx xxx
------WebKitFormBoundaryP9erwzQtIaB0m0tr--
)
Я не понимаю, почему Zend2 ожидает этого. Есть идеи? Какие преимущества использования x-www-form-urlencoded
над form-data
— в контексте Zend2 тогда?
Могу ли я настроить, что где-то в Zend2 использовать form-data
вариант для метода PUT?
Проблема в том, что данные формы плохо работают в PHP с запросами PUT. Это не имеет ничего общего с ZF2, это также относится к Symfony2 или Slim, например. Для запросов POST это не проблема, потому что в PHP есть внутреннее оборудование, которое анализирует данные и предоставляет их в $_POST
,
Дело в том, что синтаксический анализ данных формы не является тривиальным. Основная часть границ и разбиение нескольких ключей / значений легко. С двоичными данными становится все труднее, особенно со всеми существующими граничными условиями. Не говоря уже о невероятно больших телах, где вы предпочитаете анализ на основе потока, а не загрузку всей строки в память.
Итак, попробуйте использовать urlencoded тела или написать свой собственный анализатор данных формы. Это, к сожалению, единственные два варианта.
Других решений пока нет …