3
respostas

[Dúvida] Evento de publicação

Estou criando um feed de postagens de publicações, onde os usuários podem criar publicações, reagir a elas e comentar. No caso quando um usuário cadastrar um publicação quero enviar um evento avisando que foi criado e contabilizar isso em tempo real na propria tela.

Estou usando o laravel 10 no caso fiz assim:

Controller

public function store($request)
    {
        try {
            $post = FeedPost::create($request);

            /** TODO - vincular as mençoes de usuários */

            PostCreated::dispatch($post->post, auth()->user()->id, 'post-created');

            return response()->json("Post cadastrado com sucesso!", Response::HTTP_OK);
        } catch (Exception $exception) {
            return response()->json(['message' => 'Não foi possivel completar está ação!'],
                Response::HTTP_BAD_REQUEST);
        }
    }

Event

class PostCreated implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     */
    public function __construct(
        public int    $postId,
        public int    $userId,
        public string $action,
    )
    {
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return array<int, Channel>
     */
    public function broadcastOn(): array
    {
        return [
            new PrivateChannel('post-created'),
        ];
    }
}
3 respostas

Oii, tudo bem?

Levando em conta as informações que você forneceu, você já fez um ótimo trabalho implementando o evento PostCreated que utiliza o Laravel Broadcasting para enviar essas notificações.

Mas, percebi que há um pequeno desajuste entre a criação do evento no seu controller e a definição do evento em si. No controller, você está passando post->post para o evento, mas no construtor do evento PostCreated, o primeiro parâmetro é esperado como postId, que deve ser um inteiro. Certifique-se de que post->post seja realmente o ID do post, caso contrário, você deveria passar post->id ou a propriedade correta que representa o ID do post.

Vou te dar uma sugestão e você pode verificar se funciona para o que você deseja:

public function store($request)
{
    try {
        $post = FeedPost::create($request);

        /** TODO - vincular as mençoes de usuários */

        // Certifique-se de que está passando o ID do post corretamente
        PostCreated::dispatch($post->id, auth()->user()->id, 'post-created');

        return response()->json("Post cadastrado com sucesso!", Response::HTTP_OK);
    } catch (Exception $exception) {
        return response()->json(['message' => 'Não foi possivel completar está ação!'],
            Response::HTTP_BAD_REQUEST);
    }
}

E, verifique se você configurou corretamente o broadcasting no Laravel, incluindo o driver de broadcasting (como Pusher, Redis, etc.), e se o frontend está ouvindo ao canal correto para receber as atualizações em tempo real.

Espero que essas dicas ajudem a aprimorar sua funcionalidade de notificação de novos posts!

Um abraço!

Obrigado, vou ajustar, outro ponto eu posso usar o Redis dentro do container de aplicação ? Para poder dispara, e como faria isso usando o redis e talves gerenciando

Oi!

Sim, você pode usar o Redis dentro do container de aplicação para lidar com a transmissão de eventos em tempo real. O Redis é uma excelente opção para isso devido à sua eficiência e baixa latência.

Pra configurar o Redis para Broadcasting no Laravel, primeiro você precisa garantir que o Redis esteja instalado e configurado corretamente no seu ambiente. Isso geralmente envolve instalar o Redis Server e configurar o Laravel para se conectar a ele.

Depois de configurar o Redis no Laravel, você pode definir suas configurações de Broadcasting no arquivo config/broadcasting.php. Você precisa definir o driver como redis e configurar as informações de conexão com o Redis.

E você precisará garantir que seu servidor Redis esteja em execução e acessível pelo Laravel.

Para despachar eventos usando o Redis, você simplesmente os despacha como faria normalmente:

use App\Events\PostCreated;

PostCreated::dispatch($postId, $userId, 'post-created');

O Laravel Broadcasting cuidará do resto e transmitirá o evento para o Redis, que então será distribuído para os clientes que estão ouvindo esse canal.

Em relação ao gerenciamento do Redis, depende do ambiente em que você está implantando sua aplicação. Se você estiver usando um ambiente de contêiner, como Docker, geralmente você configura o Redis como outro serviço em seu docker-compose.yml ou em sua configuração de orquestração de contêineres.

Consulte a documentação oficial do Laravel e do Redis para obter instruções detalhadas sobre como configurar esses serviços em seu ambiente específico.

Um abraço.