#php #laravel #laravel-8
Вопрос:
Я хочу отредактировать некоторую информацию, полученную из базы данных, в edit.blade.php
:
<form action="{{ route('updateWallet', ['id'=>$wallet->id]) }}" method="POST" enctype="multipart/form-data">
@csrf
<label for="title" class="control-label">Title</label>
<input type="text" id="title-shop" name="title" class="form-control" value="{{ $wallet->title }}" autofocus>
<input class="form-check-input" type="checkbox" name="cachable" value="cashable" id="cacheStatus" @php if(($wallet->is_cachable) == 1) {echo 'checked';} @endphp>
<label class="form-check-label" for="cacheStatus">
amp;nbsp; With Cash
</label>
<input class="form-check-input" type="checkbox" name="activaton" value="active" id="activationStatus" @php if(($wallet->is_active) == 1) {echo 'checked';} @endphp>
<label class="form-check-label" for="activationStatus">
amp;nbsp; Active
</label>
<button class="btn btn-success">Submit</button>
</form>
И маршрут для этого проходит здесь:
Route::post('wallets/update/{wallet}','WalletWalletController@update')->name('updateWallet');
Затем на Контроллере:
public function update(Request $request, Wallet $wallet)
{
try {
$data = $request->validate([
'title' => 'required',
'activation' => 'nullable',
'cachable' => 'nullable'
]);
$wallet->title = $data['title'];
if (!empty($data['activation'])) {
$wallet->is_active = 1;
} else {
$wallet->is_active = 0;
}
if (!empty($data['cachable'])) {
$wallet->is_cachable = 1;
} else {
$wallet->is_cachable = 0;
}
$wallet->save();
flash()->overlay('Updated!', 'Your data edited successfully.', 'success');
}catch (Exception $e) {
dd($e);
}
return redirect(url('admin/wallets/index'));
}
Это работает нормально и идеально, так как я не добавляю имя метода в лезвие.
Но когда я пытаюсь это сделать, я получаю эту ошибку:
The PUT method is not supported for this route. Supported methods: POST.
А также , когда я добавляю method('PATCH')
вместо method('PUT')
, я получаю это:
The PATCH method is not supported for this route. Supported methods: POST.
Так что же здесь происходит не так?
Когда подходящее время для использования методов PUT и PATCH и как их правильно использовать?
Ответ №1:
стандартно использовать запрос post, когда мы храним что-то в первый раз, и запрос put/patch, когда мы что-то обновляем. однако вы можете использовать запрос post в обоих случаях. но метод html-формы принимает запрос get или post. вы не можете использовать атрибут put/patch/delete для метода формы. мы используем метод подмены, чтобы использовать эти запросы с формой, используя метод («PUT»), который создает новое поле ввода.
<input type="hidden" name="_method" value="PUT">
это определяет тип запроса формы. но для того, чтобы это сработало, URL-адрес отправки вашей формы должен быть объявлен как маршрут put (исправление, если вы хотите использовать запрос на исправление).
Route::put('wallets/update/{wallet}','WalletWalletController@update')->name('updateWallet');
изменение метода в форме не изменит определенный вами тип маршрута. вы должны изменить это сами. вы должны определить, какой тип запроса вы будете использовать, и как форма, так и маршрут должны использовать один и тот же тип запроса.
Ответ №2:
Когда вы меняете метод в форме в файле блейда, вы должны изменить метод в файле маршрута:
Route::put('wallets/update/{wallet}','WalletWalletController@update')->name('updateWallet');
И изменить метод, изложенный в форме:
<form>
{{ method_field('PUT') }}
</form>
Комментарии:
1. В чем польза от его использования таким образом, я имею в виду, в чем разница и какой из них лучше?
2. Так
method('PUT')
не меняет ли метод маршрута ? Когда я должен использоватьmethod('PUT')
?