Versión del contenido estático en Magento 2

La versión de los ficheros estáticos se encuentra en un fichero llamado deployed_version.txt y está en la ruta pub/static. En modo developer, se crea una nueva versión cuando no se encuentra el fichero. Por eso cuando ejecutamos el comando setup:static-content:deploy, la versión se renueva, porque este comando incluye la acción de eliminar el fichero. Cuando se renueva, obligamos a los navegadores refrescar el caché del navegador. También funciona para los servicios de CDN tales como FASTLY, AKAMAI, O CLOUDFLARE. En modo producción, si no se encuentra el fichero, Magento lanzará un mensaje de error, si la regeneración de la versión no es a la demanda.

La versión es el resultado devuelto por la función time(). Este valor es la fecha Unix actual. Podemos convertir esta fecha de forma más legible con Javascript.

    
        # Generamos el tiempo Unix en la línea de comandos: php -a

        echo time(); //1666645617

        # Cogemos el resultado y lo convertimos con Javascript en una fecha y hora más legible para humanos

        const fecha_y_hora = new Date(1666645617 * 1000).toLocaleString('es-ES')
        console.log(fecha_y_hora) // '24/10/2022, 23:06:57'

        # También podemos convertirlo en una fecha más legible con php

        echo date('Y-m-d H:m:s', 1666645617)
    

A partir de la información de la versión podemos saber cuándo fue la fecha y hora del último despliegue. ¡Ojo! Siempre que la generación de los ficheros estáticos NO sea a la demanda. En producción, normalmente esta opción está desactivada.

Los comandos que hacen cambiar la firma de la versión de Magento son los siguientes:

  • magento setup:upgrade
  • magento setup:static-content:deploy

Análisis del código

En php, una clase se crea así:

    
        # Para más info: https://www.php.net/manual/es/language.oop5.basic.php
        # Creamos clase. Generalizamos, por ejemplo, Persona. Una persona tiene piernas y puede correr.

        class ClaseSencilla
        {
            // Declaración de una constante
            const constante = 'un valor predeterminado';

            // Declaración de una propiedad
            public $variable = 'un valor predeterminado';

            // Declaración de un método
            public function mostrarVariable() {
                echo $this->variable;
            }
        }

        # Creamos una instancia de la clase. Concretamos valores, por ejemplo, David, María etc.
        # David es hombre y María es mujer. Los dos son personas.

        $instancia = new ClaseSencilla();
    

Vamos a ver cómo se crea objeto de una clase en Magento.

    
        # Interface StorageInterface: lib/internal/Magento/Framework/App/View/Deployment/Version/StorageInterface.php
        # Clase File: lib/internal/Magento/Framework/App/View/Deployment/Version/Storage/File.php
        ...
        public function __construct(
            \Magento\Framework\Filesystem $filesystem,
            $directoryCode,
            $fileName
        ) {
            $this->directory = $filesystem->getDirectoryWrite($directoryCode);
            $this->fileName = $fileName;
        }
        ...

        # File implementa la interface StorageInterface
        # La clase File tiene un constructor al que le pasamos 2 parámetros: $directoryCode y $fileName
        # Los argumentos del constructor se definen en los ficheros xml.

        // Ruta: app/etc/di.xml
        <type name="Magento\Framework\App\View\Deployment\Version\Storage\File">
            <arguments>
                <argument name="directoryCode" xsi:type="const">Magento\Framework\App\Filesystem\DirectoryList::STATIC_VIEW</argument>
                <argument name="fileName" xsi:type="string">deployed_version.txt</argument>
            </arguments>
        </type>

        # Hasta aquí, hemos visto la clase File y hemos visto también que los parámetros se han definido en el fichero app/etc/di.xml.
        # Vamos a ver cómo se crea el objeto File

        // Mapeo de la interface StorageInterface a la clase File
        <preference for="Magento\Framework\App\View\Deployment\Version\StorageInterface" type="Magento\Framework\App\View\Deployment\Version\Storage\File"/>

        // Así podemos inyectar la StorageInterface en la clase Version. Automáticamente se hará instancia de la clase File
        // Ruta: lib/internal/Magento/Framework/App/View/Deployment/Version.php

            /**
             * Deployment version of static files
             */
            class Version
            {
                    ...
                /**
                 * @var \Magento\Framework\App\View\Deployment\Version\StorageInterface
                 */
                private $versionStorage;

                /**
                 * @param Version\StorageInterface $versionStorage
                 */
                public function __construct(
                    \Magento\Framework\App\View\Deployment\Version\StorageInterface $versionStorage,
                ) {
                    $this->versionStorage = $versionStorage;  // asignar el objeto creado a la propiedad versionStorage
                }

                    ...
                // Se han usado métodos del objeto versionStorage en este método

                /**
                 * Load or generate deployment version of static files depending on the application mode
                 *
                 * @param string $appMode
                 * @return string
                 */
                protected function readValue($appMode)
                {
                    $result = $this->versionStorage->load();
                    if (!$result) {
                        if ($appMode == \Magento\Framework\App\State::MODE_PRODUCTION
                            && !$this->deploymentConfig->getConfigData(
                                ConfigOptionsListConstants::CONFIG_PATH_SCD_ON_DEMAND_IN_PRODUCTION
                            )
                        ) {
                            $this->getLogger()->critical('Can not load static content version.');
                            throw new \UnexpectedValueException(
                                "Unable to retrieve deployment version of static files from the file system."
                            );
                        }
                        $result = $this->generateVersion();
                        $this->versionStorage->save($result);
                    }
                    return $result;
                }

                ..

    

Si traducimos lo anterior a la sintaxis de php normal sería como lo siguiente:

    
        $filesystem = new Filesystem(...);
        $directoryCode = '';
        $fileName = '';

        $versionStorage = new File($filesystem, $directoryCode, $fileName);
        $versionStorage->load();
        $versionStorage->save($result);
    

¿Interesante no? Magento tiene muchos ejemplos como este. Ya iremos viendo más en otros artículos.

Referencias