@a0xh

Как удалить файл при обновлении данных?

Есть такой метод: (/App\Http\Controllers\Admin\UserController)
public function update(UpdateUserRequest $request, User $user): RedirectResponse
{
    $data = $request->only(['name', 'domain', 'email']);

    if ($request->hasFile('avatar')) {
        $deleteImage = new DeleteImageAction();
        $deleteImage->handle($user->avatar);

        $avatar = $request->file('avatar')->store(date('Y-m-d'));
    }

    if ($request->input('status') !== 'on') {
        $status = false;
    }

    $this->user->update($user, array_merge($data, [
        'avatar' => $avatar ?? $user->avatar,
        'password' => Hash::make($request->input('password')),
        'status' => $status ?? true
    ]), $request->role);

    session()->flash('success',
        (new FlashNotificationsAction())->handle('user.update')
    );

    return redirect()->action([self::class, 'index']);
}

И универсальный экшен: (App\Actions\DeleteImageAction)
final class DeleteImageAction
{
    public function handle($image)
    {
        if (isset($image) && File::exists(Storage::path($image))) {
            return (Storage::disk('public'))->delete($image);
        }

        return null;
    }
}

Загружаю и устанавливаю картинку, но если удаляю картинку и сохраняю данные пользователя, то сохраняется ранее загруженная картинка. Оно и очевидно, т. к. стоит $avatar ?? $user->avatar.

Как можно проверить, что картинка не загружена, поэтому ее нужно удалить? Но опять же, если картинка остается прежней, то ее не нужно удалять.

Может дело в Dropify? Не знаю, в JS не шарю, поэтому может и по другому как-то можно это сделать?
<input type="file" id="avatar" name="avatar" class="dropify @error('avatar') is-invalid @enderror" data-default-file="{{ Storage::url($user->avatar) }}" data-allowed-file-extensions="jpg jpeg png svg gif">
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Вам нужно с фронтенда присылать какой-то флаг, который будет говорить о том, что аватар был удалён. И уже по этому флагу вы будете удалять файл из профиля.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы