Почему метод store() работает, но не update() ?

#php #laravel

#php #laravel

Вопрос:

Мой код работает во store() время, но как только я пытаюсь обновить сохраненный образ, он ничего не делает. Когда я проверял с помощью dd() , файл вообще не загружался.

 public function update(Request $request, $id)
{
    $request->validate([
        'title' => 'required',
        'type' => 'required',
        'city' => 'required',
        'district' => 'required',
        'comment' => 'required',
        'full_comment' => 'required',
        'photo' => 'sometimes|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
    ]);

    $game = Game::find($id);
    $game->title = $request->get('title');
    $game->type = $request->get('type');
    $game->city = $request->get('city');
    $game->district = $request->get('district');
    $game->comment = $request->get('comment');
    $game->full_comment = $request->get('full_comment');

    if ($request->has('photo')) {
        $game->photo = $request->get('photo');
        $photoName = $game->id.'photo'.time().'.'.request()->photo->getClientOriginalExtension();
        $game->photo = $photoName;
        $request->photo->storeAs('game-photos', $photoName);
    }
    $game->save();

    return redirect('/games')->with('success', 'Game has been  updated');
}
 

Комментарии:

1. Пожалуйста, постарайтесь более четко изложить свою проблему, например, представив методы whole store и update . Прямо сейчас, например, у вас есть $game переменная, которая берется из ниоткуда.

2. @FrancinaldoAlmeida извините, я обновил код

3. Попробуйте использовать hasFile('photo') вместо has('photo') , и проверьте, верно ли это условие, чтобы мы могли продолжить отладку кода.

4. @FrancinaldoAlmeida Я пытался, но фото все еще не загружается, я даже пытался удалить оператор if, затем я получаю сообщение об ошибке «Вызов функции-члена getClientOriginalExtension() при null». Обновление игры работает с инструкцией if, но фотография не обновляется

5. Можете ли вы проверить, что ваши формы имеют правильный enctype="multipart/form-data" набор?

Ответ №1:

Предоставленный метод контроллера, хотя и не является оптимальным, должен работать правильно (и работает в моем случае). Пожалуйста, сравните вашу форму со следующим фрагментом:

 <form method="post" action="{{ route('game.update', $game) }}" enctype="multipart/form-data">
    {!! csrf_field() !!}
    {!! method_field('PUT') !!}
    <input type="file" name="photo">
    <input type="submit">
</form>
 

Кроме того, вставьте это в самый верх вашего update метода. Он покажет все отправленные файлы или пустой массив, если таковых нет.

 dd($request->files);