Как Laravel обрабатывает запросы PUT из браузеров?
Я знаю, что браузеры поддерживают только запросы POST
и GET
, а Laravel поддерживает запросы PUT
, используя следующий код:
<?= Form::open('/path/', 'PUT'); ?>
... form stuff ...
<?= Form::close(); ?>
Это создает следующий HTML
<form method="POST" action="http://example.com/home/" accept-charset="UTF-8">
<input type="hidden" name="_method" value="PUT" />
... form stuff ...
</form>
Как это работает с инфраструктурой? Захватывает ли запрос POST
до решение о том, к какому маршруту отправляется запрос? Использует ли он ajax для отправки фактического PUT
в фреймворк?
Ответы
Ответ 1
Вставляет скрытое поле, и это поле указывает, что это запрос PUT или DELETE
Смотрите здесь:
echo Form::open('user/profile', 'PUT');
приводит к:
<input type="hidden" name="_method" value="PUT">
Затем он ищет _method при маршрутизации в файле ядра request.php
(ищите "spoofing" в коде) - и если он его обнаружит - будет использовать это значение для маршрутизации к правильному спокойному контроллеру.
Он все еще использует "POST" для достижения этого. Не используется ajax.
Ответ 2
Laravel использует Symfony Http Foundation, который проверяет эту переменную _method и изменяет запрос на PUT или DELETE на основе его содержимого. Да, это происходит до начала маршрутизации.
Ответ 3
Вы также можете использовать массив в своей форме так:
{{ Form::open( array('route' => array('equipment.update', $item->id ),
'role' => 'form',
'method' => 'put')) }}
Просто измените метод на то, что вы хотите.
Ответ 4
В то время как поздний ответ, я считаю важным добавить это для всех, кто находит это, и не может заставить их API работать.
При использовании маршрутов ресурсов Laravel, таких как:
Route::resource('myRoute','MyController');
Ожидается PUT
для вызова метода update()
. Чтобы это нормально работало (вне представления формы), вам необходимо убедиться, что вы передаете ContentType как x-www-form-urlencoded. Это значение по умолчанию для форм, но выполнение запросов с помощью cURL или с помощью такого инструмента, как Postman не будет работать, если вы не установили это.
Ответ 5
PUT обычно ссылается на запрос на обновление.
Когда вы открываете форму внутри шаблона ларавельного лезвия, используя
{{ Form::open('/path/', 'PUT') }}
Это создало бы скрытое поле внутри формы следующим образом:
<input type="hidden" name="_method" value="PUT" />
Чтобы обрабатывать запрос PUT внутри вашего контроллера, вам нужно создать метод с префиксом put,
for example, putMethodName()
поэтому, если вы укажете,
{{ Form::open('controller/methodName/', 'PUT') }}
внутри Форма: открыта. Затем вам нужно будет создать метод контроллера следующим образом:
class Controller extends BaseController {
public function putMethodName()
{
// put - usual update code logic goes here
}
}
Ответ 6
в действительности нет запроса PUT!
его запрос POST!
когда вы говорите laravel; эй laravel это запрос PUT! это означает, что вы хотите обновить какой-то ресурс!
{{Форма:: open ('пользователь/профиль', 'PUT')}}
приведенная выше строка означает его запрос PUT (просто это означает обновление ресурса, как я уже упоминал, до того, как нет запроса PUT)
эта строка кода создает скрытую запись в форме, которая указывает тип запроса, и когда маршрутизатор laravel получает запрос, он ищет обработчик PUT URI
например sth:
Route:: put ('the/url/you/упоминание/здесь/', 'someController @someAction');