Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Desafios da aula

Fiz os testes para implementar a exclusão do arquivo de capa quando a série fosse excluída e o alocar uma imagem padrão nos casos em que o usuário não definir uma capa para a série cadastrada. Segue o código abaixo, demonstrando a solução. Teria alguma opção melhor para conclusão destes desafios?

SeriesControlles - store

public function store(SeriesFormRequest $request)
    {   
        //Este if verifica se existe uma imagem inserida no input, se o retorno for positivo ele cria a série com a capa selecionada
        //se for negativo ele utiliza o arquivo padrão "no_cover.gif" que fica armazenado na pasta storage/app/public/series_cover.
        if($request->hasFile('cover')){
            $coverPath = $request->file('cover')->store('series_cover', 'public');
            $request->coverPath = $coverPath;
        }else{
            $request->coverPath = 'series_cover/no_cover.gif';
        }

        $serie = $this->repository->add($request);

        SeriesCreatedEvent::dispatch(
          $serie->nome,
          $serie->id,
          $request->seasonsQty,
          $request->episodesPerSeason,
          $request->coverPath,
        );

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

SeriesControlles - destroy

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

        SeriesDestroyed::dispatch(
            $series->cover_path,
        );

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

Event - SeriesDestroyed

public function __construct(
        public readonly string $cover_path,
    )
    {        
    }

Listener - DeleteCoverSeriesDestroyed

//a função handle recebe o cover_path da série a ser excluída e verifica, se o arquivo for diferente do padrão, que não possui capa,
//ele envia os dados para exclusão do arquivo.
public function handle(SeriesDestroyed $event)
    {
        if($event->cover_path != 'series_cover/no_cover.gif'){
            Storage::disk('public')->delete([$event->cover_path]);
        }

    }

Também configurei as classes novas no EventServiceProvider, mas acho que não é necessário postar aqui. Como desafio pessoal, estou tentando descobrir como enviar a capa no e-mail que informa sobre a criação da série, mas até o momento não tive muito sucesso.

Obs.: Como sugestão, acho que seria interessante ter uma aula, ou somente a transcrição do código mostrando como seria a solução do desafio para os que não conseguiram, ou até mesmo para que os que conseguiram pudessem comparar as soluções.

7 respostas

Opa, João. Uma possível resposta para o desafio está nessa atividade em que você abriu a dúvida. É só clicar em "Ver opinião do instrutor".

Sobre exibir a imagem no e-mail, basta colocar o caminho completo da imagem com o domínio em questão (que no caso é http://localhost mesmo).

Vinicius, boa tarde.

Eu acabei vendo a sugestão somente depois de ter feito o desafio e postado aqui no fórum. Mas obrigado pela atenção e por ter colocado já de início.

Quanto a exibição da imagem, não está funcionando ainda, testei de várias formas, mas não funcionou. Fiz algumas pesquisas pela internet e não sei se entendi errado, mas parece que por ser um servidor local, o navegador não mostra a imagem mesmo. De qualquer forma, vou postar abaixo o código que fiz e a resposta, pra ver se errei alguma coisa.

View do series0created.blade

@component('mail::message')

    # Série {{ $seriesName}} foi criada!

   //Esta foi a primeira tentativa que fiz, utilizando o html
   <img src="{{ asset('storage/' . $cover_path) }}" alt="Capa da série {!! $seriesName !!}" class="img-fluid" style="height: 400px; margin: auto;">

    //Este foi o segundo teste, usando a documentação do markdown
    ![Capa da série {!! $seriesName !!}]({{asset('storage/' . $cover_path)}})

    //Essa versão eu encontrei no StackOverflow, mas também não funcionou como eu queria.
    ![Capa da série][capa]
    [capa]: {{ asset('storage/' . $cover_path) }}

    A série {{ $seriesName}} possui {{ $qtySeasons }} temporadas com {{ $qtyEpisodes }} episódios cada.

    Clique aqui para acessá-la:

    @component('mail::button', ['url' => route('seasons.index', $idSerie)])
        Acessar
    @endcomponent

@endcomponent

Segue agora uma imagem mostrando como foi o retorno do e-mail, a parte do table no final do componente eu ainda não consegui descobrir de onde veio, mas está aparecendo desde que criei o markdown: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Eita, estranho mesmo. Custa nada tentar: Roda um composer update pra ver se não é um bug com uma versão minor do Laravel

Fiz o teste rodando o composer update, mas não resolveu. O retorno foi o mesmo.

Se facilitar, vou mandar aqui o link do git do sistema.

https://github.com/joaopassareli/controle-series-atualizado

solução!

Putz, João, detalhe pequeno que eu honestamente não sabia que acontecia: indentação.

O conteúdo do e-mail não pode estar indentado senão o markdown vai interpretar isso como um pedaço de código a ser exibido e não vai processar o código, entende?

Perfeito, Vinicius. Era este mesmo o problema. Retirei as indentações e agora está funcionando perfeitamente. Caso seja de ajuda de alguém, vou deixar o código do markdown aqui.

@component('mail::message')

# <center>Série {{ $seriesName}} foi criada!<br/></center>

<center><img src="{{ asset('storage/' . $cover_path) }}" alt="Capa da série {!! $seriesName !!}" class="img-fluid" style="height: 400px; margin: auto;"></center>

A série {{ $seriesName}} possui {{ $qtySeasons }} temporadas com {{ $qtyEpisodes }} episódios cada.

Clique aqui para acessá-la:

@component('mail::button', ['url' => route('seasons.index', $idSerie)])
Acessar
@endcomponent

@endcomponent

E somente um feedback sobre o curso, queria te parabenizar, as aulas são ótimas, bem explicadas e um conteúdo bem interessante. Já havia feito o curso anterior de laravel, mas este confesso que gostei mais, o conteúdo foi bem interessante e fácil de ser assimilado. Já estou fazendo o curso de APIs agora.

Novamente, muito obrigado pela ajuda nesta questão.

Fico muito feliz que esteja curtindo, João. E que bom que o problema foi resolvido. :-D

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software