gstreamer0.10-ffmpeg
gstreamer0.10-plugins-good
packages.
Cuando hablamos del frontend de un sitio, nos referimos principalmente a dos cosas: CSS y JavaScript. Empecemos por la parte CSS... que es muy sencilla con AssetMapper. Crea un archivo CSS dentro del directorio assets/
e inclúyelo con una etiqueta link
a la antigua usanza que utilice la ruta lógica del archivo. Y ya está. Cero magia.
Esto es un poco diferente de Encore. Con un sistema de compilación como Encore, puede que estés familiarizado con hacer cosas como esta: import './styles/app.css
. Ese tipo de cosas no funcionan en un entorno de navegador. Las declaraciones de importación son para importar archivos JavaScript, punto. De acuerdo, técnicamente puedes cargar CSS de forma perezosa, pero ése es un caso extremo del que no necesitamos preocuparnos ahora.
La cuestión es que no puedes importar archivos CSS desde archivos JavaScript y no pasa nada: añadir una etiqueta link
funciona de maravilla.
Vale: ya sabemos que podemos hacer referencia a cualquier archivo del directorio assets/
utilizando la funciónasset()
... lo que ya hemos hecho dos veces.
Pero, ¿y si necesitamos hacer referencia a un archivo -como esta imagen- desde dentro de un archivo CSS?
... lines 1 - 20 | |
<body class="bg-gray-800 text-white"> | |
... lines 22 - 49 | |
<img src="{{ asset('images/penguin.png') }}"> | |
... lines 51 - 69 | |
</body> | |
... lines 71 - 72 |
Echa un vistazo. Aquí arriba, tenemos un pequeño icono de registro en la esquina superior izquierda. Cámbialo por un span
con class="bg-logo"
para que podamos incluir nuestra imagen del pingüino en su lugar. Copia ese encabezado de clase bg-logo
en app.css
, añade .bg-logo
y... añadiré algunos estilos básicos.
... lines 1 - 20 | |
<body class="bg-gray-800 text-white"> | |
... lines 22 - 25 | |
<a href="{{ path('app_homepage') }}" class="flex"> | |
<span class="bg-logo"></span> | |
... line 28 | |
</a> | |
... lines 30 - 69 | |
</body> | |
... lines 71 - 72 |
La gran pregunta es: ¿cómo podemos establecer la imagen de fondo... ya que elpenguin.png
final tendrá un nombre de archivo versionado? La respuesta es: exactamente como lo harías normalmente: url()
y luego la ruta relativa al archivo: ../images/penguin.png
.
... lines 1 - 3 | |
.bg-logo { | |
display: inline-block; | |
width: 32px; | |
height: 32px; | |
background-image: url('../images/penguin.png'); | |
background-size: contain; | |
background-repeat: no-repeat; | |
} |
Así es exactamente como se hace en Encore y exactamente como se haría si estos archivos se sirvieran directamente a nuestro navegador. Simplemente tenemos que escribir el código "correcto" y funcionará.
Añadamos 2 estilos más para el fondo... ¡y a probar! Actualiza y... ¡sí, funciona! Inspecciona la imagen... y luego mira el archivo CSS final. Abrámoslo en una nueva pestaña.
¡Perfecto! En su mayor parte, los archivos finales coinciden exactamente con los archivos de origen. Sin magia. Sin embargo, en este caso, AssetMapper hizo un pequeño cambio. En el archivo original, nos referíamos a ../images/penguin.png
. Pero aquí tenemos../images/penguin-versionhash.png
. Sí, AssetMapper hizo ese pequeño cambio para que las cosas siguieran funcionando, a pesar de los nombres de archivo versionados.
La cuestión es: puedes codificar como si nada... y todo funciona.
A continuación: ¡invitemos a la fiesta a CSS de terceros como Bootstrap y fuentes!
"Houston: no signs of life"
Start the conversation!
// composer.json
{
"require": {
"php": ">=8.1",
"ext-ctype": "*",
"ext-iconv": "*",
"babdev/pagerfanta-bundle": "^4.0", // v4.2.0
"doctrine/doctrine-bundle": "^2.7", // 2.10.0
"doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.4
"doctrine/orm": "^2.12", // 2.15.2
"knplabs/knp-time-bundle": "^1.18", // v1.20.0
"pagerfanta/doctrine-orm-adapter": "^4.0", // v4.1.0
"pagerfanta/twig": "^4.0", // v4.1.0
"stof/doctrine-extensions-bundle": "^1.7", // v1.7.1
"symfony/asset": "6.3.*", // v6.3.0
"symfony/asset-mapper": "6.3.*", // v6.3.0
"symfony/console": "6.3.*", // v6.3.0
"symfony/dotenv": "6.3.*", // v6.3.0
"symfony/flex": "^2", // v2.3.1
"symfony/framework-bundle": "6.3.*", // v6.3.0
"symfony/http-client": "6.3.*", // v6.3.0
"symfony/monolog-bundle": "^3.0", // v3.8.0
"symfony/proxy-manager-bridge": "6.3.*", // v6.3.0
"symfony/runtime": "6.3.*", // v6.3.0
"symfony/stimulus-bundle": "^2.9", // v2.9.1
"symfony/twig-bundle": "6.3.*", // v6.3.0
"symfony/ux-turbo": "^2.9", // v2.9.1
"symfony/web-link": "6.3.*", // v6.3.0
"symfony/yaml": "6.3.*", // v6.3.0
"twig/extra-bundle": "^2.12|^3.0", // v3.6.1
"twig/twig": "^2.12|^3.0" // v3.6.1
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.4
"symfony/debug-bundle": "6.3.*", // v6.3.0
"symfony/maker-bundle": "^1.41", // v1.49.0
"symfony/stopwatch": "6.3.*", // v6.3.0
"symfony/web-profiler-bundle": "6.3.*", // v6.3.0
"zenstruck/foundry": "^1.21" // v1.33.0
}
}