Laravel 5.7: метод обновления возвращает «Нет сообщения»

Я все перепробовал и не могу понять, в чем моя ошибка.

метод update () не обновляет ничего, я получаю только ошибку "Нет сообщения" ...

Вот маршруты в web.php:

Route::get('/user/edit/{id}', ['as' => 'users.edit', 'uses' => 'UserAdController@edit']); Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);

просмотр users / edit.blade.php:

<div class = "container">
        <br>
        <h3>Edit your ad</h3>
        <br>

        <form method = "post" action = "{{route('users.update', $ad->id)}}">
            <input name = "_method" type = "hidden" value = "PATCH">
            {{ method_field('post') }}
            <div class = "form-group">
                <label for = "title">Title</label>
                <input type = "text" name = "title" class = "form-control" id = "title" value = "{{$ad->title}}">
            </div>
            <div class = "form-group">
                <label for = "title">Price</label>
                <input type = "text" name = "price" class = "form-control" id = "title" value = "{{$ad->price}}">
            </div>
            <div class = "form-group">
                <label for = "content">Your content</label>
                <textarea name = "content" class = "form-control" id = "content" rows = "3">{{$ad->content}}</textarea>
            </div>
            <div class = "form-group">
                <input type = "submit" value = "Update" class = "btn btn-info">
            </div>
        </form>
</div>
@endsection

Метод обновления из UserAdController:

public function update($id, Request $request){

    $request->validate([
        'title'=>'required',
        'price'=> 'required|integer',
        'content' => 'required'
    ]);

    $data = \App\Ad::find($id);
    $data->title = $request->get('title');
    $data->price = $request->get('price');
    $data->content = $request->get('content');
    $data->save();

    return redirect()->back()->with('success', 'Data updated');

}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
1 108
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Попробуйте вместо этого

public function update(Request $request){
   //your code here
}
Попробуйте вместо этого Отсутствуют некоторые объяснения того, какие изменения и почему.
Cid 28.10.2018 13:30

Request-> only () возвращает массив с одним элементом, а валидатор - это наиболее распространенный способ обработки входящего запроса.

use Validator;


    public function update(Request $request, $id){


       $v = validator($request->only('title', 'price', 'content'), [
        'title' => 'required|string|max:255',
        'price' => 'required|integer',
        'content' => 'required',
       ]);

       $data = request()->only('title','price','content');


       $userData = ([
        'title' => $data['title'],
        'price' => $data['price'],
        'content' => $data['content'],
       ]);


       $data = \App\Ad::find($id);

       $data->update($userData); 

       return response()->json($data); 

   }
Попробуйте вместо этого Отсутствуют некоторые объяснения того, какие изменения и почему.
Cid 28.10.2018 13:30
Ответ принят как подходящий

Я не разработчик Laravel. Я просто наткнулся на документацию. Вы также должны добавить поле csrf к своему клинку

В edit.blade.php добавьте это после открывающего тега <form>.

{{csrf_field()}}

Кроме того, параметры в вашем методе обновления не очень хорошо организованы.

Должен быть

public function update(Request $request, $id) { 


}

Второй параметр ($id) исходит из того, что вы определили как свои маршруты в файле web.php.

Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);

Где {id} будет заменен оригинальным id

Отсутствуют некоторые объяснения того, почему $id должен быть справа.

Cid 28.10.2018 13:29

Спасибо вам всем !!

Похоже, я делал это неправильно.

Мне нужно было добавить {{csrf_field()}} в форму редактирования и использовать $request->only()

Я думаю, было бы лучше, если бы вы использовали такой метод put:

Route::put('ad/{ad}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);

обновите свою форму, чтобы она была такой:

<div class = "container">
    <br>
    <h3>Edit your ad</h3>
    <br>

    <form method = "post" action = "{{route('users.update', ['ad' => $ad->id])}}">
        <input name = "_method" type = "hidden" value = "PATCH">
        {{ method_field('put') }}
        {{ csrf_field() }}
        <div class = "form-group">
            <label for = "title">Title</label>
            <input type = "text" name = "title" class = "form-control" id = "title" value = "{{$ad->title}}">
        </div>
        <div class = "form-group">
            <label for = "title">Price</label>
            <input type = "text" name = "price" class = "form-control" id = "title" value = "{{$ad->price}}">
        </div>
        <div class = "form-group">
            <label for = "content">Your content</label>
            <textarea name = "content" class = "form-control" id = "content" rows = "3">{{$ad->content}}</textarea>
        </div>
        <div class = "form-group">
            <input type = "submit" value = "Update" class = "btn btn-info">
        </div>
    </form>

и теперь ваша функция обновления:

public function update(\App\Ad $ad, Request $request){

$request->validate([
    'title'=>'required',
    'price'=> 'required|integer',
    'content' => 'required'
]);

//$data = \App\Ad::find($id);
$ad->update([
   "title" => $request->title,
   "price" => $request->price,
   "content" => $request->content,
]);

return redirect()->back()->with('success', 'Data updated');

}

когда вы научитесь использовать методы put, delete и patch, вы сможете прочитать о Route :: resource, и ваш код станет проще.

Другие вопросы по теме