v13.34.0.
El registro y la publicación son procesos distintos
loadViewsFrom() registra una ruta de búsqueda para un espacio de nombres. publishes() registra el origen y el destino de la copia, y la copia real la realiza vendor:publish. En el siguiente ejemplo, puedes usar courier::deliveries.show sin publicar nada.
src/CourierServiceProvider.php
resources/views/deliveries/show.blade.php. Los puntos del nombre de la vista se convierten en separadores de directorio durante la búsqueda.
resources/views/deliveries/show.blade.php
courier, indicado como segundo argumento de loadViewsFrom(), es el contrato que define tanto la referencia a las vistas como el directorio de sobrescritura.
El destino de sobrescritura se busca archivo por archivo
Cuando se resuelveview, ServiceProvider::loadViewsFrom() recorre en orden las rutas de view.paths de la configuración. Si en alguna de ellas existe el directorio vendor/courier, lo añade al espacio de nombres y, por último, añade la ruta del paquete.
FileViewFinder busca en orden en las rutas de ese espacio de nombres y devuelve el primer archivo que encuentra. En una configuración que usa el resources/views estándar, el orden es el siguiente.
No se trata de cambiar todo el directorio. Aunque el usuario sobrescriba solo deliveries/show.blade.php, las demás vistas que no haya sobrescrito se cargan desde el paquete.
En configuraciones con varias entradas en
view.paths, también puede haber varios destinos de sobrescritura. resource_path('views/vendor/courier') es el destino de publicación de este ejemplo, no un proceso que limite la búsqueda a esa ubicación. Usa un espacio de nombres propio del paquete y evita diseños en los que varios providers añaden rutas al mismo nombre.Personalizar solo las vistas necesarias
El usuario puede copiar las plantillas con el siguiente comando. Indica el provider y la etiqueta para no arrastrar otros recursos.Volver a publicar no fusiona diferencias
Normalmente,VendorPublishCommand omite la copia si ya existe un archivo con el mismo nombre en el destino. --force sobrescribe los archivos existentes. Además, --existing también es una opción que “sobrescribe los archivos ya publicados”, no un modo que conserve las ediciones del usuario.
Ninguno de estos métodos es una fusión que compare la versión antigua, la nueva y las ediciones del usuario. Tampoco eliminan automáticamente del destino de publicación las vistas que se hayan quitado del paquete. No reduzcas el procedimiento de actualización a “volver a publicar la misma etiqueta”.
Mantener las vistas también como API pública
No solo los nombres de las vistas, sino también los datos que reciben y los componentes a los que hacen referencia afectan a las personalizaciones del usuario. Por ejemplo, si en una nueva versión cambiastrackingCode por otro nombre de variable, los usuarios que conserven la plantilla antigua dejarán de recibir el valor que necesitan desde el nuevo código.
Antes de publicar una versión, comprueba los siguientes contratos.
- No cambiar sin motivo el espacio de nombres ni los nombres de vista como
deliveries.show. - Documentar las variables que se pasan, sus tipos y si son obligatorias u opcionales.
- Incluir en los cambios los destinos de
@includey@extendsy las props de los componentes Blade. - Indicar en las notas de la versión las vistas modificadas y los cambios que deben aplicarse a las versiones antiguas ya publicadas.
La caché de Blade no actualiza los archivos de sobrescritura
view:cache precompila las plantillas Blade a PHP. ViewCacheCommand ejecuta primero view:clear y, a continuación, reúne las rutas de vistas normales y las rutas registradas en los espacios de nombres para buscar los archivos que debe compilar.
Distinguirla de la caché de resultados de búsqueda
FileViewFinder::find() guarda la ruta encontrada en el array $views de esa instancia del Finder. Además, la comprobación de existencia del directorio de sobrescritura se realiza en el callback de loadViewsFrom(). Añadir un directorio nuevo después del arranque no lo agrega automáticamente a las rutas de búsqueda ya registradas.
view:clear no es un comando que borre de una vez el estado del Finder que mantienen otros procesos en ejecución. En procesos de larga duración como Octane, recárgalos siguiendo el procedimiento de despliegue habitual. flush() del Finder borra los resultados de búsqueda, pero no llega a registrar nuevos directorios de sobrescritura.
Qué comprobar antes de publicar una versión
Además de las pruebas del paquete, comprueba las siguientes combinaciones en una aplicación de usuario. Una prueba que solo renderiza la plantilla más reciente no verifica la compatibilidad con los usuarios que publicaron la versión antigua.- Sin publicar, se renderiza la vista del paquete.
- Al sobrescribir un solo archivo, solo ese archivo tiene prioridad y los demás recurren al paquete.
- Aun conservando las plantillas publicadas de la versión antigua, se puede renderizar con los datos que pasa la nueva versión.
- La republicación normal conserva las personalizaciones y la adición de archivos no publicados es la esperada.
- Tras modificar un archivo de sobrescritura,
view:cachese ejecuta correctamente y, en un nuevo arranque, se muestra el cambio.
Páginas relacionadas
Vistas
Repasa los fundamentos de la creación de vistas, el paso de datos y la precompilación.
Plantillas Blade
Repasa el uso de layouts, include y componentes.
Gestión de la compatibilidad de versiones
Vincula los cambios en el contrato de las plantillas con la política de versiones.
Octane
Repasa el ciclo de vida y la recarga de las aplicaciones de larga duración.
Fuentes primarias consultadas
- Documentación oficial de Laravel: vistas de paquetes
- ServiceProvider: registro de rutas de vistas
- FileViewFinder: orden de búsqueda y conservación de resultados
- VendorPublishCommand: condiciones de publicación de archivos
- ViewCacheCommand: recopilación de rutas de vistas y compilación
- ViewClearCommand: eliminación de archivos compilados
- Compiler: comprobación de la fecha de modificación