Este tutorial nos encontrará abordando algunos temas diferentes, sin embargo, el objetivo principal es poder configurar los hilos de clasificación por popularidad de acuerdo con la cantidad de respuestas que tiene cada hilo. Para comenzar, necesitaremos hacer algunos cambios en la vista principal que muestra todos los hilos. Una vez que lo solucionemos a nuestro gusto, podemos comenzar a desarrollar la prueba que será necesaria para nuestra nueva función. Luego escribiremos la prueba, implementaremos el código y nos aseguraremos de que todo funcione también en el navegador.


Uso de CSS básico para colocar un elemento de la interfaz de usuario

Vimos en el último tutorial cómo mostrar el número de respuestas a cualquier hilo dado en la vista show.blade.php. Eso también nos brindó una buena introducción a los ámbitos de consulta globales. Ahora, sería bueno enumerar también la cantidad de respuestas de hilo en la página de inicio. En otras palabras, cuando se muestra la vista index.blade.php para mostrar todos los hilos, deberíamos mostrar el recuento de respuestas para cada hilo. Entonces, en primer lugar, veamos el código que muestra cada hilo individual en la página principal. Se resalta a continuación dentro de las etiquetas html <article>.

Nuestro objetivo es poner el recuento de respuestas para cada hilo en el lado derecho de cada cuadro de artículo. ¿Cómo podemos lograr este objetivo? Aquí hay algunas adiciones y modificaciones a la vista de índice para comenzar. Agregamos un div con una clase CSS de 'nivel' para que podamos apuntar a eso para diseñar un poco. El elemento <h4> también recibe una nueva clase llamada 'flex' para la que configuraremos reglas en breve. Directamente después del elemento <h4> es donde agregamos el código para mostrar el número de respuestas de hilo. Finalmente, agregamos un elemento <hr> horizontal después de la etiqueta html <article> para separar mejor cada hilo individual.

Si bien nuestros hilos son bastante tontos, el diseño se ve bastante decente. ¡Incluso en esta primera etapa!
posicionamiento básico de la interfaz de usuario en la página de índice

Ahora podemos centrarnos en posicionar ese recuento de respuestas que se muestra. Todo lo que haremos es agregar algunas reglas CSS realmente básicas directamente en el archivo app.blade.php por ahora. A continuación, verá que agregamos el estilo básico en la etiqueta <style> que necesitamos.

¡Vamos muy bien!
estilo CSS empujando el elemento a la derecha sin flotar


Vincular el recuento de respuestas

Aquí envolvemos la etiqueta <strong> que contiene el recuento de respuestas del hilo con una etiqueta <a> donde el href se establece en el valor de {{$ thread-> path ()}}. Esto creará un enlace a la vista show.blade.php que mostrará ese hilo en particular con todas sus respuestas.

envoltura de etiqueta fuerte con etiqueta de anclaje


Ordenar hilos por número de respuestas

Ahora que la visualización del recuento de hilos en la página principal está funcionando bien, es hora de agregar una forma de filtrar u ordenar los hilos en función del número de respuestas que tiene cada hilo. Queremos incluir siempre una prueba para las nuevas funciones que agregamos. En este escenario, estamos tratando con cómo el usuario debe leer los hilos. Tiene sentido abrir nuestra clase ReadThreadsTest y comenzar a inventar una prueba para esta característica. Aquí están todas nuestras pruebas hasta ahora en esta clase, y el método eliminado para nuestra nueva prueba que estamos creando ahora que se llama test_a_user_can_filter_threads_by_number_of_replies ().


Lluvia de ideas sobre el pseudocódigo

Antes de que podamos escribir la prueba, tenemos que pensar en cómo crearla. En otras palabras, ¿cuál es la secuencia de eventos Dado - Cuándo - Entonces que estamos viendo aquí?

  • Dado que hay 3 hilos
  • Dado que hay 2, 3 y 0 respuestas en dichos hilos
  • Cuando el usuario filtra todos los hilos por recuento
  • Luego, los hilos deben devolverse en orden de más respuestas a menos

Este escenario se traduce en este código en el método test_a_user_can_filter_threads_by_number_of_replies (). Tenga en cuenta que en el método de aserción hay una llamada a array_columnCompruébelo en el manual de PHP si necesita un repaso como yo.

Bien, es hora de hacer esta prueba y ver cómo nos va.

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

F 1/1 (100%)

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

Hubo 1 falla:

1) TestsFeatureReadThreadsTest :: test_a_user_can_filter_threads_by_number_of_replies
Se devolvió JSON no válido de la ruta.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:513
/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:527
/home/vagrant/Code/forumio/tests/Feature/ReadThreadsTest.php:73

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

Vemos que se devolvió un error de JSON no válido de la ruta. ¿Por qué está pasando esto? Bueno, nunca configuramos ningún tipo de capacidad para que ninguno de los métodos del controlador devuelva JSON como respuesta. Están devolviendo páginas completas de HTML en este momento. Sin embargo, hay una manera de devolver JSON condicionalmente mediante el método wantsJson (). Para permitir esto, puede actualizar el método index () en ThreadsController.php para usar este condicional 'if'.

El método index () ahora tiene la capacidad de devolver json si se solicita. Nuestra prueba está solicitando json, por lo que ahora debería funcionar. Podemos ejecutar la prueba test_a_user_can_filter_threads_by_number_of_replies una vez más ahora.
vagrant @ homestead: ~ / Code / forumio $ phpunit –filter test_a_user_can_filter_threads_by_number_of_replies

PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 1,2 segundos, memoria: 8,00 MB

Hubo 1 falla:

1) TestsFeatureReadThreadsTest :: test_a_user_can_filter_threads_by_number_of_replies
No se pudo afirmar que dos matrices son iguales.
--- Esperado
+++ Real
@@ @@
 Matriz (
- 0 => 3
- 1 => 2
- 2 => 0
+ 0 => '0'
+ 1 => '2'
+ 2 => '3'

/home/vagrant/Code/forumio/tests/Feature/ReadThreadsTest.php:74

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

Bueno, esto está bastante bien. Echa un vistazo a la matriz que se extrajo del json, genial. Tenga en cuenta que la respuesta nos muestra explícitamente lo que se espera y lo que realmente sucedió. Esperamos un orden de 3,2,0 sin embargo obtuvimos un orden de 0,2,3. Necesitamos poder filtrar la consulta por popularidad, lo que aún no tenemos la capacidad de hacer.


Construyendo sobre la clase ThreadFilters

Recientemente, nos tomó mucho tiempo aprender a refactorizar consultas SQL en una clase dedicada. Así es como se nos ocurrió la clase ThreadFilters que, como recordará, actualmente puede filtrar por nombre de usuario. Bien adivina que. Como ya hizo todo ese trabajo preliminar, puede agregar muchos más tipos de habilidades de filtrado a esa clase, lo que ahora será bastante fácil, ya que el trabajo duro ya está hecho. Las adiciones que hacemos a la clase se destacan aquí, luego discutiremos.

Lo primero que hicimos fue agregar una clave 'popular' a la matriz $ filtros. Después de eso, agregamos un método popular () correspondiente a la clase. En realidad, este es un método interesante. A primera vista, pensaría que podríamos salirse con la suya con $ this-> builder-> orderBy ('replies_count', 'desc'); todo por sí mismo. ¿Por qué existe este $ this-> builder-> getQuery () -> orders = []; código presente? Bueno, en el método index () de ThreadsController, se realiza una llamada a getThreads (). Este es un método que creamos durante la refactorización. Veamos ese método muy rápido.

Lo que nos gustaría señalar aquí es que este método ya está construyendo la consulta para nosotros. El método latest () es de hecho establecer el 'orden por' predeterminado para ordenar por el campo created_at en la base de datos. Lo que queremos en nuestro filtro popular () es 'ordenar por' el conteo de respuestas. Para que esto funcione, tenemos que borrar cualquier cláusula de "orden por" existente en la consulta existente. Para hacer esto, usa $ this-> builder-> getQuery () -> orders = []; como hicimos en el método popular () que creamos anteriormente.

Ahora podemos ejecutar nuestra prueba.

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

. 1/1 (100%)

Tiempo: 1,07 segundos, memoria: 8,00 MB

OK (1 prueba, 1 afirmación)

¡Está funcionando!

Por si acaso, podemos volver a ejecutar el conjunto completo de pruebas y descubrir que todo está pasando. Maravilloso.

vagabundo @ homestead: ~ / Código / forumio $ phpunit
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

...................... 22/22 (100%)

Tiempo: 3,1 segundos, memoria: 12,00 MB

OK (22 pruebas, 38 afirmaciones)

Agregar un enlace para el filtro popular

Lo último que tendremos que hacer es asegurarnos de que un usuario pueda activar este filtro desde el navegador. La forma más sencilla de hacerlo es simplemente proporcionar un enlace que incluya el filtro popular en la cadena de consulta. Por supuesto, esto es muy fácil, simplemente abrimos app.blade.php y agregamos un enlace a uno de los menús desplegables.

Ahora podemos filtrar por todos los hilos, hilos populares y mis hilos directamente desde la barra de navegación. Fantástico.
haga clic en el enlace para aplicar el filtro a la cadena de consulta


Resumen de clasificación de hilos por número de respuestas

¡Parece que hemos solucionado este asunto de clasificación! Gracias al trabajo anterior que habíamos realizado para configurar esa clase de filtrado de subprocesos dedicada, agregar un nuevo tipo de filtro para los subprocesos fue bastante fácil de hacer.