Post Top Ad

Your Ad Spot

martes, 15 de septiembre de 2020

Menciones y notificaciones

 

Los sitios web basados ​​en la comunidad a menudo le permiten mencionar a otro usuario por su nombre de usuario. Por ejemplo, si publica un mensaje en Twitter e incluye el nombre de un usuario con el símbolo @, el usuario recibirá una notificación de que lo mencionó. Este tutorial recreará ese tipo de función en la aplicación basada en foros que hemos estado creando. En el área de respuestas de los hilos, si un usuario escribe una respuesta e incluye @Tom como ejemplo, cuando Tom inicie sesión en su cuenta, debería ver una notificación en el área de la barra de navegación superior derecha para alertarle de que tiene un hilo para revisa.


Prueba de usuarios mencionados

Podemos comenzar creando una prueba de características y la llamaremos MentionUsersTest.
caso de prueba de usuarios mencionados

¿Qué queremos que haga esta prueba? Bueno, debería probar las notificaciones a los usuarios mencionados. Aquí está el pseudocódigo.

  • Dado que tenemos un usuario Tom que está registrado
  • Dado que también tenemos un usuario llamado Sarah
  • Si tenemos un hilo
  • Entonces Tom responde a ese hilo y menciona a @Sarah
  • Entonces @Sarah debería recibir una notificación

Con estos objetivos en mente, podemos crear el método test_mentmented_users_in_a_reply_are_notified () en la clase MentionUsersTest.

Así que tenemos la prueba, pero aún no tenemos código de soporte. Sabemos si fallará, pero podemos dejar que los errores nos ayuden a construir el código para que funcione. Actualmente, recibimos un error de "Error al afirmar que el tamaño real 0 coincide con el tamaño 1 esperado".

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_mentmented_users_in_a_reply_are_notified
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 1,61 segundos, memoria: 10,00 MB

Hubo 1 falla:

1) Pruebas \ Característica \ MentionUsersTest :: test_mentmented_users_in_a_reply_are_notified
No se pudo afirmar que el tamaño real 0 coincide con el tamaño esperado 1.

/home/vagrant/Code/forumio/tests/Feature/MentionUsersTest.php:33

¡FALLOS!
Pruebas: 1, afirmaciones: 1, fallos: 1.

¿Cómo podemos hacer que esto funcione? Considere cuándo un usuario completa el formulario para enviar una respuesta. Quizás el usuario incluya un nombre como @Tom en ese texto. A medida que se procesa ese cuerpo de texto, la aplicación debe inspeccionar el cuerpo del texto de respuesta en busca de menciones de nombre de usuario. Si se encuentran uno o más, esos usuarios deben recibir una notificación. Entonces, necesitamos una función que busque a todos los usuarios mencionados dentro del cuerpo de la respuesta. Este es un gran trabajo para expresiones regulares . Agregaremos un método Users () mencionado en el modelo Reply que aprovecha la función preg_match_all () de PHP .


Crear una clase de notificación

Recientemente, configuramos notificaciones para los usuarios que están suscritos a hilos específicos. Entonces tenemos una idea de cómo configurar notificaciones en Laravel. Recuerde que podemos utilizar artesano para organizar una clase de notificación para nosotros.

vagrant @ homestead: ~ / Code / forumio $ php artisan make: notificación que usted mencionó
Notificación creada correctamente.

clase de notificación creada

El código que podemos usar en esta nueva clase de notificación está aquí. Vale la pena prestar atención a la sección resaltada del método toArray (). El contenido de ese método se convierte en el mensaje o notificación real que se almacena en la base de datos. Nuevamente, habíamos personalizado este método durante nuestro tutorial de notificaciones de suscriptores , pero ahora necesitamos modificar un poco las cosas para este tutorial de menciones de usuarios. También tenga en cuenta que estamos aceptando la variable $ reply como una propiedad protegida en esta clase. Esa es la respuesta para la que se mencionó a un usuario. Esta clase necesita acceso a esa respuesta para hacer su trabajo.


Uso de un evento para notificar a un usuario

Ya estamos disparando un evento en el método addReply () del modelo Thread.

Además de eso, tenemos un oyente configurado para ese evento que maneja las notificaciones para los usuarios suscritos. ¿No sería genial si simplemente pudiéramos agregar otro oyente que también se encargaría de notificar a los usuarios mencionados? Eso es exactamente lo que haremos aquí. Simplemente agregaremos un nuevo oyente a la matriz como se resalta aquí. Ahora, cuando ThreadReceivedNewReply se activa, tanto NotifySubscribers como NotifyMentinatedUsers manejarán ese evento.

Una vez más, podemos ejecutar php artisan event: generate para distribuir nuestro nuevo archivo de clase.

vagrant @ homestead: ~ / Code / forumio $ php evento artesanal: generar
¡Eventos y oyentes generados con éxito!

Ahora vemos la nueva clase NotifyMentinatedUsers en el directorio Listeners.
generar evento artesanal php

Ahora, dentro del método handle (), implementamos la lógica para notificar a un usuario cuando fue mencionado.

¡Parece que la prueba está pasando!

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_mentmented_users_in_a_reply_are_notified
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

. 1/1 (100%)

Tiempo: 1,53 segundos, memoria: 10,00 MB

OK (1 prueba, 1 afirmación)

Ciclo de vida de notificación de menciones de usuario

Para resumir, así es como funciona el ciclo de vida de una notificación de mención de usuario.


Un usuario agrega una nueva respuesta y se activa un evento. Esto sucede en addReply () de Thread.php.

nueva respuesta agregada evento de incendios


La clase de evento ThreadReceivedNewReply anuncia a la aplicación que un hilo ha recibido una nueva respuesta.

clase de anuncio de evento


Ahora, en EventServiceProvider, está configurado que cuando ThreadReceivedNewReply haga un anuncio, NotifyMentheredUsers responderá a eso. De hecho, NotifySubscribers también responderá, pero en este escenario estamos más preocupados con la respuesta de NotifyMentinatedUsers. El mapeo entre la activación de un evento y la respuesta de un oyente ocurre aquí.

mapeo de eventos y oyentes


Ahora el oyente asume el control y maneja ese anuncio que se hizo. O en otras palabras, maneja el evento.

el oyente maneja el evento


Dentro del código anterior, vemos que se apoya en el método Users () mencionado que existe en el modelo Reply. Esta sintaxis es una forma elegante de verificar todos los usuarios mencionados y luego buscarlos en la base de datos.

preg coincide con todos los hallazgos de los usuarios mencionados


Luego, para cada uno que encuentre, se realiza una notificación a través de la clase de notificación YouWereMentmented.

el usuario fue mencionado clase de notificación


Poniendo el caucho a la carretera

Ok, es hora de poner la goma a la carretera por así decirlo. Queremos probar esto en el navegador y ver qué sucede. En primer lugar, iniciaremos sesión como el usuario Sarah y buscaremos un hilo en el que podamos responder a Tom. Lo mencionaremos con la sintaxis @Tom y le diremos que su receta es genial.
nuevo al mencionar un usuario

Ahora simplemente iniciamos sesión como usuario Tom y deberíamos ver una nueva notificación. ¡De hecho lo hacemos! Vemos que Sarah nos mencionó en el "¡Santo Guacamole!" hilo. ¡Muy genial!
notificación de usuario exitosa recibida


Resumen de menciones y notificaciones

Este tutorial se basó en nuestro conocimiento de eventos y notificaciones en Laravel para configurar un nuevo sistema de notificación para los usuarios mencionados. Ahora está armado con el conocimiento de cómo crear su propio sistema de notificación de menciones de usuario como lo ve en muchos sitios web sociales populares.


No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas