Muchos sitios web populares le permiten suscribirse a un tema o hilo en particular. En las aplicaciones de tipo foro, a menudo ve la posibilidad de suscribirse a ciertos temas, y una vez que está suscrito, puede recibir notificaciones por correo electrónico o en el sitio web. En este tutorial, crearemos un sistema de suscripción de subprocesos. Es bastante complicado ya que necesita el sistema de back-end para alimentarlo, además de un botón de suscripción reactivo impulsado por VueJS en el front-end. Además, habrá un área de notificaciones en la parte superior derecha del sitio web similar a lo que puede ver en Facebook o Reddit.
Se puede suscribir un hilo
Entonces, ¿qué es lo primero que podemos hacer? Bueno, comenzaremos con una prueba en nuestra clase ThreadTest existente. A modo de inicio rápido, aquí está el pseudocódigo.
- Dado que hay un hilo
- Dado un usuario autenticado
- Cuando ese usuario se suscribe al hilo
- Entonces, el usuario debería poder recuperar todos los hilos suscritos
La ejecución de la prueba nos muestra lo que debemos hacer a continuación, que es crear un nuevo método subscribe ().
vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_thread_can_be_subscriptions_to PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. E 1/1 (100%) Tiempo: 1,27 segundos, memoria: 8,00 MB Hubo 1 error: 1) TestsUnitThreadTest :: test_a_thread_can_be_subscriptions_to BadMethodCallException: llamada al método no definido IlluminateDatabaseQueryBuilder :: subscribe ()
Podemos crear este nuevo método subscribe () en el modelo Thread.php así. De hecho, avanzaremos un poco en aras de la brevedad y desarrollaremos algunos métodos que vamos a necesitar. No es necesario que muestre aquí todas las pruebas fallidas. Necesitaremos un método subscribe (), un método subscriptions () y una nueva clase ThreadSubscriptions junto con una nueva migración.
vagrant @ homestead: ~ / Code / forumio $ php artisan make: model ThreadSubscription -m Modelo creado con éxito. Migración creada: 2018_02_20_192313_create_thread_subscriptions_table
Los campos que necesitaremos en nuestra nueva tabla de base de datos están definidos por la migración que acabamos de crear de la siguiente manera:
También agregaremos estos dos nuevos métodos a nuestra clase modelo Thread.php.
Finalmente, también agregaremos una relación básica a la clase ThreadSubscription. Estamos diciendo "Esta suscripción a un hilo pertenece a un hilo".
Ahora estamos obteniendo un estado de aprobación en esta primera prueba.
vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_thread_can_be_subscriptions_to PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. . 1/1 (100%) Tiempo: 831 ms, memoria: 8,00 MB OK (1 prueba, 1 afirmación)
Se puede cancelar la suscripción a un hilo
Por supuesto, un usuario también podrá darse de baja de cualquier hilo en particular al que se haya suscrito. También podemos agregar una prueba para eso. Entonces, ¿cuál es el caso de prueba?
- Dado que hay un hilo
- Dado que un usuario está suscrito a ese hilo
- Cuando se activa la función de cancelación de suscripción
- Entonces el hilo no debería tener suscripciones
Aquí está el código de prueba real para esta función.
Para que esta prueba pase, necesitaremos algunas cosas. Primero hay un nuevo método unsubscribe () en el modelo Thread.
Con esa simple adición, la prueba pasa.
vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_thread_can_be_unsubscriptions_from PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. . 1/1 (100%) Tiempo: 840 ms, memoria: 8,00 MB OK (1 prueba, 1 afirmación)
Ahora nuestro entorno de prueba ejecutará migraciones automáticamente en cada ejecución de prueba, pero también ejecutaremos las migraciones manualmente para que podamos probarnos en el navegador y ver la función de suscripción funcionando a medida que avanzamos.
vagrant @ homestead: ~ / Code / forumio $ php migrar artesanal Migrando: 2018_02_20_192313_create_thread_subscriptions_table Migrado: 2018_02_20_192313_create_thread_subscriptions_table
Todavía no tenemos la interfaz para probar la suscripción a un hilo, pero podemos probar esto en Tinker. Veamos. Obtendremos un hilo reciente y lo almacenaremos en una variable.
>>> $ hilo = AppThread :: último () -> primer (); => AppThread {# 814 id: 59, user_id: 53, channel_id: 1, title: "El clima es hermoso afuera", body: "La primavera está en el aire y las temperaturas exteriores se están calentando. ¡Disfruta del hermoso día!", created_at: "2018-02-20 18:06:12", updated_at: "2018-02-20 18:06:12", replies_count: 3, creador: AppUser {# 822 id: 53, nombre: "Nikola Tesla", created_at: "2018-01-23 18:07:43", updated_at: "2018-01-23 18:07:43", }, canal: AppChannel {# 812 id: 1, nombre: "repellat", slug: "repellat", created_at: "2017-12-21 16:32:19", updated_at: "2017-12-21 16:32:19", }, }
Ahora, suscribiremos a un usuario a ese hilo. Aquí estamos diciendo que el usuario con el id de 52 se está suscribiendo al hilo dado.
>>> $ hilo-> subscribe (52); => AppThread {# 814 id: 59, user_id: 53, channel_id: 1, title: "El clima es hermoso afuera", body: "La primavera está en el aire y las temperaturas exteriores se están calentando. ¡Disfruta del hermoso día!", created_at: "2018-02-20 18:06:12", updated_at: "2018-02-20 18:06:12", replies_count: 3, creador: AppUser {# 822 id: 53, nombre: "Nikola Tesla", created_at: "2018-01-23 18:07:43", updated_at: "2018-01-23 18:07:43", }, canal: AppChannel {# 812 id: 1, nombre: "repellat", slug: "repellat", created_at: "2017-12-21 16:32:19", updated_at: "2017-12-21 16:32:19", }, }
Podemos verificar la nueva tabla de base de datos que hemos creado y, efectivamente, ¡vemos una nueva suscripción allí!
También deberíamos poder cancelar la suscripción con la misma facilidad. Veamos.
>>> $ hilo-> cancelar suscripción (52); => nulo
Ahora, cuando revisamos la base de datos, la suscripción que vimos hace un minuto ya no existe. ¡Parece que los métodos subscribe () y unsubscribe () funcionan muy bien!
Implementación de una prueba de funciones de nivel superior
Comenzamos en el nivel de Unidad para configurar la funcionalidad más básica para suscribirse y cancelar la suscripción a un hilo. Ahora avanzaremos en la cadena y trabajaremos en el nivel de prueba de funciones para respaldar aún más el código.
El desarrollo de la primera prueba a nivel de Característica se ve así.
Vamos a necesitar un par de rutas para admitir esta nueva función. Agregaremos un punto final en el que podamos publicar para una nueva suscripción, así como un punto final para eliminar una suscripción.
Una nueva clase ThreadSubscriptionsController
Configuramos algunas rutas que hacen referencia a la clase ThreadSubscriptionsController, pero aún no tenemos esa clase. Vamos a crearlo.
vagrant @ homestead: ~ / Code / forumio $ php artisan make: controller ThreadSubscriptionsController Controlador creado con éxito.
También agregaremos un método happy little store () en nuestro nuevo controlador.
Ejecutar nuestra prueba muestra que hemos hecho lo suficiente para que esta prueba pase.
vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_user_can_subscribe_to_threads PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores. . 1/1 (100%) Tiempo: 1,3 segundos, memoria: 10,00 MB OK (1 prueba, 1 afirmación)
Agregar un botón de suscripción a la interfaz de usuario
Los conceptos básicos del back-end ahora están desarrollados y, según las pruebas que hemos creado, parecen estar funcionando. Ahora queremos configurar un botón en la interfaz que responda adecuadamente a la entrada del usuario. En otras palabras, el botón debe mantener el estado, de manera similar a como lo hizo el botón del componente secundario de vuejs favorito . Con eso en mente, podemos crear un nuevo componente SubscribeButton.vue.
Completaremos SubscribeButton.vue como tal.
En Thread.vue necesitamos hacer referencia al nuevo componente en un par de puntos.
Finalmente, renderizaremos el nuevo botón en nuestro archivo threads / show.blade.php de esta manera.
¡Voila!
En realidad, hay una buena cantidad de comportamiento en los fragmentos anteriores y sigue los mismos conceptos que hemos estado cubriendo con respecto al trabajo con componentes de Vue. Probar este nuevo botón de suscripción en el navegador ahora nos muestra que hacer clic en el botón produce una nueva suscripción en la base de datos. Además, tenga en cuenta que el estado del botón cambia correctamente para indicar que se ha suscrito. ¡Frio!
¿Está suscrito el hilo?
Deberíamos agregar un captador de atributo personalizado al modelo de Thread para decirnos si un hilo está suscrito actualmente o no. Aprendimos un poco sobre cómo funcionan estos en un tutorial anterior. Para esta iteración, el código se vería así en Thread.php.
También configuraríamos la propiedad $ appends así.
Si simplemente devolvemos los datos con formato JSON del método show () en ThreadsController, vemos que tenemos acceso a esa información necesaria.
Estos son los datos que se envían cuando hacemos referencia
en hilos / show.blade.php.
Eliminar una suscripción
Todo está funcionando para hacer clic en el botón y ver una nueva suscripción en la base de datos. Todo lo que tenemos que hacer es agregar un método destroy () a la clase ThreadSubscriptionsController para eliminar también una suscripción.
Ahora, al hacer clic en el botón, se agrega una nueva suscripción. Además, al hacer clic por segunda vez, se eliminará la suscripción. ¡Se ve bien!
Resumen del tutorial del sistema de suscripción de Laravel
Este tutorial cubrió los conceptos básicos de la configuración del código necesario para un sistema de suscripción para los usuarios de la aplicación. Cuando un usuario hace clic en un botón de suscripción en la interfaz de usuario, ese usuario crea una nueva entrada en la base de datos para indicar una suscripción exitosa. Al hacer clic en el botón nuevamente, se elimina la suscripción para ese usuario. En el siguiente tutorial, veremos cómo configurar notificaciones para usuarios suscritos.
0 Comentarios