If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeVisita /admin
¡Sorpresa! Tenemos una sección de administración en nuestro sitio. Bueno... más o menos. Es sólo un gran rectángulo, pero representa a un administrador ficticio. ¿Por qué? Bueno, supongamos que tenemos algunos CSS y JS que sólo se necesitan aquí. Si escribimos eso de la forma normal y en los archivos normales, ese código se va a descargar en todas partes, incluso cuando alguien vaya al frontend de nuestro sitio. Eso, como mínimo, es un despilfarro. Una forma mejor es descargar el CSS y el JS del admin sólo cuando se visita el área del admin
Mi forma favorita de hacerlo es con los controladores lazy Stimulus, de los que ya hemos hablado. Pero otra opción es crear un conjunto extra de CSS y JavaScript que se carguen explícitamente sólo en estas páginas. Veamos cómo hacerlo con AssetMapper.
Si utilizáramos Webpack Encore, abriríamos el archivo webpack.config.js
y añadiríamos una segunda entrada. Eso daría lugar a un nuevo archivo CSS y JavaScript. En AssetMapper, podemos hacer algo muy parecido.
Empecemos por el CSS, que es bastante sencillo. En el directorio assets/styles/
, crea un archivo admin.css
y, para ver si las cosas funcionan, añade .admin-wrapper
con algo de relleno X-Y.
.admin-wrapper { | |
padding: 0 3rem; | |
} |
Eso añadirá un poco de espacio aquí. A continuación, entra en la plantilla de esta página - templates/admin/dashboard.html.twig
- y, justo aquí, añade esa clase: class="admin-wrapper"
.
... lines 1 - 8 | |
{% block body %} | |
<div class="admin-wrapper"> | |
... lines 11 - 14 | |
{% endblock %} |
En este punto, el nuevo archivo admin.css
está técnicamente disponible públicamente... porque está en el directorio assets/
. Pero, aún no lo estamos utilizando. Para ello, necesitamos una etiqueta de enlace.
Esto no tiene nada de especial. Di {% block stylesheets %}
y {% endblock %}
para anular el bloque de la plantilla padre. Luego llama a {{ parent() }}
para incluir lo normal y, aquí abajo, añade <link rel="stylesheet"
apuntando aasset('styles/admin.css')
. Y... déjame arreglar mi errata aquí arriba. Eso es lo que queremos.
... lines 1 - 2 | |
{% block stylesheets %} | |
{{ parent() }} | |
<link rel="stylesheet" href="{{ asset('styles/admin.css') }}"> | |
{% endblock %} | |
... lines 8 - 16 |
De vuelta al sitio... ¡sí! El CSS se está aplicando: tenemos relleno extra. Refrescantemente sencillo.
Pero... ¿qué pasa con JavaScript? Una vez más, empezaremos como en Encore. Crea un nuevo archivo... quizá junto a app.js
llamado admin.js
. Añadeconsole.log('admin.js file')
para que podamos ver si se está cargando.
console.log('admin.js file!'); |
Al igual que con el archivo CSS, este archivo ya está disponible públicamente... pero nada lo está cargando. Recuerda: el archivo app.js
se carga gracias a esta línea<script type="module">
de aquí abajo que importa app
. Lo obtenemos automáticamente, en base.html.twig
, a través de la función Twig importmap()
.
Entonces... ¿hay alguna forma de decirle a esta función que importe también nuestro archivo admin.js
? En realidad, ¡no! ¿Por qué? Principalmente porque... ¡es muy fácil añadirlo nosotros mismos!
Observa: en dashboard.html.twig
, pon {% block javascripts %}
, {% endblock%}
, y luego {{ parent() }}
. Debajo, añade una etiqueta <script>
con type="module"
. Ahora vamos a codificar como si estuviéramos en un archivo JavaScript. Di import
y luego la ruta al archivo JavaScript. Efectivamente, queremos algo como - /assets/admin.js
. Pero, por supuesto, para obtener la ruta real utilizamos la función asset()
y pasamos la ruta lógica: admin.js
.
... lines 1 - 8 | |
{% block javascripts %} | |
{{ parent() }} | |
<script type="module"> | |
import '{{ asset('admin.js') }}'; | |
</script> | |
{% endblock %} | |
... lines 16 - 24 |
¡Ya está! ¡Vamos a probarlo! Actualiza y comprueba la consola. ¡Ya está! ¡Nuestro archivo admin.js
se está cargando! Si echas un vistazo a la fuente de la página... aquí abajo... sí. Puedes ver <script type="module">
de la función importmap()
donde diceimport 'app'
. Y, después, importamos admin.js
a través de su ruta.
El original es sólo import 'app'
... porque confiamos en elimportmap
para mapearlo a su URL. Eso está bien... pero en realidad no es necesario. Poner la ruta aquí también funciona bien. Eso es lo que hacemos por simplicidad.
Una de las cosas que hemos visto en este capítulo es que todo lo que hay en el directorio assets/
se expone públicamente... ¡que es para lo que sirve AssetMapper! Pero a veces puedes tener algunos archivos que quieras poner en ese directorio, pero mantenerlos privados. Veamos a continuación la función de exclusión de AssetMapper y otras opciones de configuración.
"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
}
}