При Использовании PUT или ИСПРАВЛЕНИЯ Для Обновления Данных

#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') ?