v13.34.0.
L’enregistrement et la publication sont deux traitements distincts
loadViewsFrom() enregistre un chemin de recherche pour un namespace. publishes() enregistre une source et une destination, mais c’est vendor:publish qui effectue réellement la copie. Dans l’exemple suivant, courier::deliveries.show est utilisable même sans publication.
src/CourierServiceProvider.php
resources/views/deliveries/show.blade.php. Les points du nom de vue sont convertis en séparateurs de répertoire lors de la recherche.
resources/views/deliveries/show.blade.php
courier, passé en second argument de loadViewsFrom(), qui constitue le contrat pour référencer les vues et pour le répertoire de surcharge.
Rechercher la surcharge fichier par fichier
Lorsqueview est résolu, ServiceProvider::loadViewsFrom() parcourt dans l’ordre les chemins de la configuration view.paths. Si un répertoire vendor/courier existe dans l’un de ces chemins, il est ajouté au namespace, puis le chemin du package est ajouté en dernier.
FileViewFinder parcourt ensuite les chemins de ce namespace dans l’ordre et renvoie le premier fichier trouvé. Avec la configuration standard utilisant resources/views, l’ordre est le suivant.
Il ne s’agit pas de basculer un répertoire entier. Si l’utilisateur ne surcharge que deliveries/show.blade.php, les autres vues non surchargées sont toujours chargées depuis le package.
Si
view.paths contient plusieurs chemins, il peut aussi y avoir plusieurs emplacements de surcharge. resource_path('views/vendor/courier') n’est que la destination de publication de cet exemple, et non un traitement qui limiterait la recherche à cet emplacement. Utilisez un namespace propre au package et évitez une conception où plusieurs providers ajoutent des chemins au même nom.Ne personnaliser que les vues nécessaires
L’utilisateur peut copier les templates avec la commande suivante. Il indique le provider et le tag pour ne pas entraîner d’autres ressources.La republication ne fusionne pas les différences
En règle générale,VendorPublishCommand ignore la copie lorsqu’un fichier de même nom existe déjà à la destination. --force écrase les fichiers existants. Par ailleurs, --existing est lui aussi une option qui « écrase les fichiers déjà publiés » : ce n’est pas un mode qui conserve les modifications de l’utilisateur.
Aucune de ces méthodes n’effectue de fusion comparant l’ancienne version, la nouvelle version et les modifications de l’utilisateur. Aucune ne supprime non plus automatiquement de la destination les vues retirées du package. Ne réduisez pas la procédure de mise à jour à « republier le même tag ».
Maintenir les vues comme une API publique
Au-delà du nom des vues, les données reçues et les éléments référencés influencent aussi les personnalisations des utilisateurs. Par exemple, si la nouvelle version renomme la variabletrackingCode, les utilisateurs qui ont conservé l’ancien template ne recevront plus la valeur nécessaire depuis le nouveau code.
Avant une publication, vérifiez les points de contrat suivants.
- Ne pas modifier à la légère le namespace ni les noms de vues comme
deliveries.show. - Documenter les variables transmises, leurs types et leur caractère obligatoire ou facultatif.
- Inclure dans les changements les cibles de
@includeet@extends, ainsi que les props des composants Blade. - Indiquer dans les notes de version les vues modifiées et les changements à appliquer aux anciennes versions publiées.
Le cache Blade ne met pas à jour les fichiers de surcharge
view:cache précompile les templates Blade en PHP. ViewCacheCommand exécute d’abord view:clear, puis rassemble les chemins de vues ordinaires et ceux enregistrés pour les namespaces afin de trouver les fichiers à compiler.
Distinguer le cache des résultats de recherche
FileViewFinder::find() enregistre les chemins trouvés dans le tableau $views de l’instance du Finder. De plus, l’existence des répertoires de surcharge est vérifiée dans le callback de loadViewsFrom(). Ajouter un nouveau répertoire après le démarrage ne l’ajoute donc pas automatiquement aux chemins de recherche déjà enregistrés.
view:clear n’est pas une commande qui efface en bloc l’état du Finder conservé par d’autres processus en cours d’exécution. Pour les processus de longue durée comme Octane, rechargez-les en suivant votre procédure de déploiement habituelle. La méthode flush() du Finder efface les résultats de recherche, mais n’enregistre pas les nouveaux répertoires de surcharge.
Points à vérifier avant une publication
En plus des tests du package, vérifiez les combinaisons suivantes dans une application qui l’utilise. Un test qui ne rend que le template le plus récent ne permet pas de vérifier la compatibilité pour les utilisateurs ayant publié une ancienne version.- Sans publication, les vues du package sont rendues.
- Lorsqu’un seul fichier est surchargé, seul ce fichier est prioritaire et les autres se rabattent sur le package.
- Avec un ancien template publié conservé, le rendu fonctionne avec les données transmises par la nouvelle version.
- Une republication ordinaire conserve les personnalisations, et l’ajout des fichiers non publiés se fait comme prévu.
- Après modification d’un fichier de surcharge,
view:cacheréussit et l’affichage modifié apparaît au démarrage suivant.
Pages associées
Vues
Les bases de la création des vues, de la transmission de données et de la précompilation.
Templates Blade
L’utilisation des layouts, des include et des composants.
Gestion de la compatibilité des versions
Relier les changements de contrat des templates à votre politique de publication.
Octane
Le cycle de vie et le rechargement des applications de longue durée.
Sources primaires consultées
- Documentation officielle de Laravel : vues des packages
- ServiceProvider : enregistrement des chemins de vues
- FileViewFinder : ordre de recherche et conservation des résultats
- VendorPublishCommand : conditions de publication des fichiers
- ViewCacheCommand : collecte des chemins de vues et compilation
- ViewClearCommand : suppression des fichiers compilés
- Compiler : vérification des dates de modification