4
respostas

Exclusão da imagem não funciona, nem pela sugestão do professor

Estou executando os métodos sugeridos na opinião do instrutor, para o desafio de exclusão da imagem da capa da série, mas não realiza a exclusão. Exclui somente o registro da série, mas a imagem permanece no caminho da storage. Debugando, vi que o caminho chega certo até o método construtor, mas parece que não executa o método handle(). O que pode ter acontecido de errado?

4 respostas

Talvez seja isso que você precise inserir no código pra remover o arquivo.

Storage::delete('file.jpg');

https://laravel.com/docs/9.x/filesystem#deleting-files

Ele utilizou alguns desses mêtodos aqui

https://laravel.com/docs/9.x/requests#files

A minha classe de Job está criada assim, segundo a solução sugerida no curso pelo instrutor (OBS.: eu tentei rodar com o formato declarativo de public readonly string no atributo do construtor, mas mesmo com o PHP ativo na versão 8.2 deu pau, por isso resolvi simplificar):

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Storage;

class DeleteSeriesCover implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private string $seriesCoverPath;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($seriesCoverPath)
    {
        $this->seriesCoverPath = $seriesCoverPath;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Storage::disk('public')->delete($this->seriesCoverPath);
    }
}

E ainda assim não executa o Job quando chama o dispatch no método destroy de SeriesController:

use App\Jobs\DeleteSeriesCover;

....

public function destroy(Series $series, Request $request)
    {
        $series->delete();

        DeleteSeriesCover::dispatch($series->cover);

        return to_route('series.index')
            ->with('mensagem.sucesso', "Série '{$series->name}' removida com sucesso");
    }

Dando um dd() em seriesCoverPath Da o caminho correto? Se sim, vc colocando ele sem ser pela variável, ele apaga?

Talvez seja algo com o path em si. Testa removendo ou adicionando algum diretório, já que não deu erro. Ou um if com o exists()

Storage::disk('public')->exists('caminho');

Descobri qual era o problema! Para o job ser processado, era necessário inicializar via console as filas de processamento:

php artisan queue:listen

Daí processou a exclusão da imagem.