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

[Dúvida] Desafio de criar um listener para a adição da série

Pesquisei várias formas de resolver este desafio:

"Vou deixar um desafio para você, não é necessário, mas o desafio é remover a linha $serie = $this->repository->add($request); e criar outro listener, que vai criar a série. Ao longo do desenvolvimento você vai encontrar diversos problemas, visto que vai precisar do ID que teríamos que ter já, então, fica o desafio para tentar encontrar uma solução para esses problemas, ou seja, adicionar a série em outros listener ao invés de executar no SeriesController."

Mas acredito que tudo o que preciso seria uma forma de obter o valor do próximo ID de uma tabela com autoincrement. Pensei que poderia pegar o valor do id máximo com:

FacadesDB::select("SELECT LAST(ID) FROM 'series'"))->get()

e somar +1. Porém, uma tabela com autoincrement torna cada id único e não atribuível a um novo elemento mesmo que seja deletado. E não quero mudar isso.

Seria o caminho por aqui: https://laravel.com/docs/5.1/queries#Auto-Incrementing-IDs ? Não tenho certeza pois acredito que isso cria um ciclo.

  1. Devo adicionar a série usando um listener X, e, depois de adicioná-la, usar o listener X como um evento para os listeners de Email e Log?
  2. Sendo que somente o listener de Email precisa do ID da série, posso excluir o parâmetro seriesId do evento SeriesCreated e usar o código abaixo para obtê-lo somente no listener de Email?
$id = DB::table('series')->insertGetId(
    ['nome' => $event->seriesName]
);

Por acaso existe um jeito melhor e mais simples?

2 respostas
solução!

Vamos desenrolar isso.

Primeiro, sobre pegar o próximo ID de uma tabela com autoincrement, o caminho sugerido no link do Laravel que você passou (https://laravel.com/docs/5.1/queries#Auto-Incrementing-IDs) é a abordagem certa. Você pode usar o método create no Eloquent e depois acessar o ID gerado. Isso não cria um ciclo, e é uma maneira eficiente de obter o ID recém-criado.

$serie = Serie::create(['nome' => $event->seriesName]);
$id = $serie->id;

Agora, em relação à ideia de adicionar a série usando um listener X e, depois de adicioná-la, usar esse listener como um evento para os listeners de Email e Log, é uma abordagem válida.

Você pode ter um listener específico para criar a série e, em seguida, disparar um evento personalizado para notificar os outros listeners sobre a criação da série. Algo assim:

No teu listener para criar a série (SeriesCreateListener):

// Cria a série
$serie = Serie::create(['nome' => $event->seriesName]);

// Dispara um evento personalizado
event(new SeriesCreated($serie));

E então, nos teus listeners de Email e Log:

// Email listener
public function handle(SeriesCreated $event)
{
    // Aqui você tem acesso ao ID da série através de $event->serie->id
    // Faz o que precisa fazer com o ID no e-mail
}

// Log listener
public function handle(SeriesCreated $event)
{
    // Aqui também tem acesso ao ID da série através de $event->serie->id
    // Registra o log com o ID
}

Essa abordagem permite que cada listener trate a informação da série recém-criada da maneira que precisa, sem passar manualmente o ID para cada um. Simplifica o código e mantém a lógica separada. Se o listener de Email é o único que precisa do ID, você não precisa adicionar o parâmetro seriesId ao evento SeriesCreated.

Muito obrigado!