Cache y condicionales en Blade, la PEOR combinación Laravel

Te muestro una anecdota sobre un desarrollo en el cual empleo cache y condicionales en blade.

Te quería aquí comentar algo muy curioso que me paso entre el uso de la cache y los condicionales, que cuando lo dices así, parece bastante obvio el problema pero aún así te lo puedes tomar ya como un pequeño reto que me estaba sucediendo antes en la aplicación aquí de desarrollo libre te explico un poquito el contexto por aquí yo tengo en un controlador para mostrar el detalle de una pagina, empleando un sistema de cache que lo activo cuidando esta en producción:

 if (config('app')['env'] == 'production') {
           //*** flujo normal, busca en cache
           $keyCache = 'post_show_' .  $category_url_clean . '_' . $post_url_clean;
           if (Cache::has($keyCache)) {
               return Cache::get($keyCache);
           }
       }

Desde la plantilla maestra, muestro u oculto cierto contenido por si estamos en modo PC o movil:

@if (!isMobile())
 Contenido no movil
@endif

Cuando precisamente haces estos condicionales y cuando trabajas con la cache es que tenemos el problema, ya que, la cache que va a quedar registrada es la que dependen del dispositivo del cliente, si entra por un móvil y no hay cache, entonces va a generar una cache para el modo móvil y quedara esa establecida por siempre, si OTRO cliente ingresa a la aplicación desde un PC para consumir la misma pagina que consumió el usuario por el móvil, devolverá la cache, pero la cache sera la generada por el móvil… Lo cual, es claramente un enorme problema porque este no es el formato correcto.

Una cache por modo

Para solucionar esto, es tan fácil como preguntando también por el modo y creando una cache especifica para cada modo:

$type = isMobile() ? 'm' : 'd';
 if (config('app')['env'] == 'production') {
           //*** flujo normal, busca en cache
           $keyCache = 'post_show_' .  $category_url_clean . '_' . $post_url_clean . '_' . $type;
           if (Cache::has($keyCache)) {
               return Cache::get($keyCache);
           }
       }

De esta forma funciona correctamente que es como yo la tengo aquí en producción entonces pues nada Eso fue una pequeña anécdota ya que tardé un ratico en darme cuenta de esto y bueno por si alguien también le sucede esto tiene que estar muy pendiente con la cach porque te puede jugar estos malos trucos como me pasó a mí así que pues nada nos vemos en otro video.

Transcripción del vídeo

Te quería comentar algo y también esto te lo puedes tomar ya como un pequeño reto que me estaba sucediendo antes en la aplicación aquí de desarrollo libre te explico un poquito el contexto por aquí yo tengo en la de show que es para mostrar todo esto que está por acá tofo el contenido que obviamente son varias cajitas varios componentes fragmentos de vista y demás yo tengo aquí un condicional para preguntar en qué modo se encuentra, por ejemplo, si aquí busco el del Master, por ejemplo  cuando está en modo móvil como es una pantalla más pequeña aquí por ejemplo no coloco el de buscar los post y otra vaya publicitaria y por aquí otras cositas aquí con un scrip importante es notar que hay menos cosas entre el modo móvil y el modo PC, en el modo pc hay mas contenido HTML especificado por unos condicionales.
Si haz seguido del curso ya tú sabes cómo hacer todo esto la traducción que es lo que vimos acá y también la parte de La cacha entonces no sé si ya te diste cuenta y ya te estoy dando bastante detalle de un posible problema que puede suceder cuando precisamente haces estos condicionales y cuando trabajas con la cache voy a comentarte un poco la situación o más que comentarte por si no lo has visto todavía vamos a seguir presionando Esto es lo que yo hago aquí en el controlador:


 if (config('app')['env'] == 'production') {
           //*** flujo normal, busca en cache
           $keyCache = 'post_show_' .  $category_url_clean . '_' . $post_url_clean . '_';
           if (Cache::has($keyCache)) {
               return Cache::get($keyCache);
           }
       }

Aquí primero verifica el ambiente por lo tanto como yo estoy aquí en desarrollo da igual lo que haga que no estamos ampliando la cache y obviamente no sucedería ese problema pero voy a colocar todo esto en producción un momentico aquí voy a colocar Production Perdón este aquí coloco Production regreso por aquí Este es el de local ahí puedes ver la URL aquí ahora estoy en PC version perfecto y aquí estoy en móvil tal cual vistes lo reconoce como móvil y recargo Y fíjate que todavía Dice PC version por qué tú crees que está sucediendo, Esto es algo como que una anécdota más que todo y es precisamente porque por aquí estamos siempre devolviendo la misma vista fíjate, que la cache se genera una sola vez no le importa los condicionales que tengamos acá ya que esto es interno de nosotros y por lo tanto la primera vez que se consulte esa vista ya sea desde modo PC o desde un dispositivo móvil él va a generar esa cache esa vista cacheada con otra vez dependiendo de lo solicitado y esa es la que voy a utilizar en mi caso hasta el fin de los tiempos porque yo solo la elimino de manera era manual y no la tiene una fecha de expiración tal cual puedes ver por acá que otra vez es una cache como quien dice sin límite de tiempo y ese era justamente el problema de por qué sucede esto que otra vez, fíjate que por aquí para que te informes un poco mejor Aquí aparece PC version por lo tanto está en el modo PC que no es justamente Este fíjate que por ejemplo esto según los nombres de los componentes que te di no deberían estar y lo puedes ver aquí en la bueno en producción aquí puedes ver que eso no aparece pero por aquí sí aparece y es porque estamos en el modo PC cosa que yo no quiero porque yo en producción quería Deshabilitar algunos componentes con los cuales el usuario no va a interactuar porque la pantalla es muy pequeña quitar la publicidad para que cargue un poco más rápido y no le esté molestando Porque Google Adsense como que le está dando fuerte a la publicidad y esos aspectos para mejorar aquí un poquito el desempeño en modo móvil.

El problema es justamente esta bendita condición que tenemos acá en la cual siempre tenemos una caché para todo el mundo cómo solucionamos esto bueno tan fácil como preguntando aquí también por el modo y así variamos la cache:

$type = isMobile() ? 'm' : 'd';
 if (config('app')['env'] == 'production') {
           //*** flujo normal, busca en cache
           $keyCache = 'post_show_' .  $category_url_clean . '_' . $post_url_clean . '_' . $type;
           if (Cache::has($keyCache)) {
               return Cache::get($keyCache);
           }
       }

Recuerda que esto viene siendo la aquí es decir aquí es el nombre de la cache que luego es la que establecemos entonces Bueno ahora como quien dice tengo el trabajo por duplicado ya que se guardan dos cachés para una misma página en en distintos formatos uno uno móvil y otro como Sería bueno no sé ni por qué coloqué d porque era móvil y PC serían ahora dos modos de esta forma funciona correctamente que es como yo la tengo aquí en producción entonces pues nada Eso fue una pequeña anécdota ya que tardé un ratico en darme cuenta de esto por si alguien también le sucede esto tiene que estar muy pendiente con la cach porque te puede jugar estos malos trucos como me pasó a mí así que pues nada nos vemos en otro video.

- Andrés Cruz

In english

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.