Je souhaite que certaines données par défaut soient accessibles dans toutes les vues de mon application Laravel 5.
J'ai essayé de le rechercher mais je ne trouve que des résultats pour Laravel 4. J'ai lu la documentation «Partage de données avec toutes les vues» ici mais je ne comprends pas quoi faire. Où doit être placé le code suivant?
View::share('data', [1, 2, 3]);
Merci de votre aide.
*
compositeurs sur vue, en particulier si vous utilisez des requêtes de base de données, car il est exécuté pour chaque sous-vue, composant, etc. inclus, de sorte que vous pourriez finir par exécuter des centaines de requêtes inutiles, la meilleure chose est d'utiliser la vue de base, par exemple les mises en page. puis transmettez les données au besoin.Réponses:
Cet objectif peut atteindre par différentes méthodes,
1. Utilisation de BaseController
La façon dont j'aime mettre les choses en place, je crée une
BaseController
classe qui étend celle de LaravelController
et j'y installe diverses choses globales. Tous les autres contrôleurs s'étendent alors à partirBaseController
du contrôleur de Laravel plutôt que du contrôleur.2. Utilisation du filtre
Si vous savez pertinemment que vous voulez quelque chose de configuré pour les vues sur chaque demande dans toute l'application, vous pouvez également le faire via un filtre qui s'exécute avant la demande - c'est ainsi que je traite l'objet User dans Laravel.
OU
Vous pouvez définir votre propre filtre
et appelez-le via un simple appel de filtre.
Mise à jour selon la version 5. *
3. Utilisation du middleware
Utiliser le
View::share
avecmiddleware
4. Utilisation de View Composer
View Composer permet également de lier des données spécifiques à afficher de différentes manières. Vous pouvez directement lier une variable à une vue spécifique ou à toutes les vues. Par exemple, vous pouvez créer votre propre répertoire pour stocker votre fichier de composition de vues en fonction des besoins. et ces fichiers de composition de vues via le service fournissent une interaction avec la vue.
La méthode de composition de vue peut utiliser une manière différente, le premier exemple peut se ressembler:
Vous pouvez créer un
App\Http\ViewComposers
répertoire.Fournisseur de services
Après cela, ajoutez ce fournisseur à config / app.php dans la section «fournisseurs».
TestViewComposer
ViewName.blade.php
Cette méthode pourrait aider uniquement pour une vue spécifique. Mais si vous souhaitez déclencher ViewComposer sur toutes les vues, nous devons appliquer cette seule modification à ServiceProvider.
Référence
Documentation Laravel
Pour plus de précisions sur l'épisode Laracast
Si quelque chose n'est toujours pas clair de mon côté, faites-le moi savoir.
la source
register()
méthode - ce n'est pas facultatif*
. Si vous n'utilisez pas le, tout*
devrait bien se passer.Vous pouvez soit créer votre propre fournisseur de services (
ViewServiceProvider
nom est courant), soit utiliser l'existantAppServiceProvider
.Dans votre fournisseur sélectionné, mettez votre code dans la méthode de démarrage.
Cela fera un
$data
variable accessible dans toutes vos vues.Si vous préférez utiliser la façade au lieu de l'assistant, changez
view()->
enView::
mais n'oubliez pas d'avoiruse View;
en haut de votre fichier.la source
AppServiceProvider
n'y a pas de problème , mais si vous avez quelque chose de plus que cela, vous devriez envisager de créer un nouveau fournisseur.composer update
également ne fonctionne pas. En fait, il ne tire pas duboot()
tout. J'ai besoin de partager deux variables.J'ai trouvé que c'était le plus simple. Créez un nouveau fournisseur et utilisez le
'*'
caractère générique pour l'attacher à toutes les vues. Fonctionne également en 5.3 :-)la source
Le meilleur moyen serait de partager la variable en utilisant
View::share('var', $value);
Problèmes de composition avec
"*"
:Envisagez l'approche suivante:
À partir d'un exemple de vue de la lame:
Ce qui se produit?
GlobalComposer
classe est instanciée 1000 fois en utilisantApp::make
.composing:some_partial_view_to_display_i
est traité 1000 fois.compose
fonction à l'intérieur de laGlobalComposer
classe est appelée 1000 fois.Mais la vue partielle
some_partial_view_to_display_i
n'a rien à voir avec les variables composéesGlobalComposer
mais augmente considérablement le temps de rendu.Meilleure approche?
Utilisation
View::share
avec un middleware groupé.Mettre à jour
Si vous utilisez quelque chose qui est calculé via le pipeline middleware, vous pouvez simplement écouter l' événement approprié ou placer le middleware de partage de vues au dernier bas du pipeline.
la source
Dans la documentation:
Je suis d'accord avec Marwelln, il suffit de le mettre
AppServiceProvider
dans la fonction de démarrage:Je recommande d'utiliser un nom spécifique pour la variable, pour éviter les confusions ou les erreurs avec d'autres variables non «globales».
la source
La documentation est entendue https://laravel.com/docs/5.4/views#view-composers mais je vais la décomposer
Recherchez le répertoire app \ Providers dans le répertoire racine de votre application et créez le fichier ComposerServiceProvider.php , copiez et collez le texte ci-dessous et enregistrez-le.
À partir de la racine de votre application, ouvrez Config / app.php et recherchez la section Providers dans le fichier et copiez et collez ce 'App \ Providers \ ComposerServiceProvider' dans le tableau.
En faisant cela, nous avons créé le fournisseur de services Composer. Lorsque vous exécutez votre application avec la vue Profile comme http: // votredomaine / quelque chose / profil , le fournisseur de services ComposerServiceProvider est appelé et la classe App \ Http \ ViewComposers \ ProfileComposer est instanciée en appelant la méthode Composer en raison du code ci-dessous dans le méthode ou fonction de démarrage.
Accédez au chemin du répertoire app / Http
Créez le répertoire appelé ViewComposers
Créez le fichier ProfileComposer.php .
Maintenant, allez dans votre vue ou dans ce cas Profile.blade.php et ajoutez
et cela montrera le nombre d'utilisateurs sur la page de profil.
Pour afficher le décompte sur toutes les pages, changez
À
la source
Je pense que le meilleur moyen est avec
View Composers
. Si quelqu'un est venu ici et veut savoir comment le faire avec View Compositeurs, lisez ma réponse => Comment partager une variable sur toutes les vues?la source
La documentation est ici https://laravel.com/docs/5.4/views#view-composers mais je vais la décomposer 1.Recherchez les fournisseurs d'annuaire dans votre répertoire racine et créez le pour ComposerServiceProvider.php avec le contenu
la source
Dans votre dossier de configuration, vous pouvez créer un nom de fichier php, par exemple "variable.php" avec le contenu ci-dessous:
Maintenant, dans toutes les vues, vous pouvez l'utiliser comme
la source
1) Dans (app \ Providers \ AppServiceProvider.php)
2) dans votre modèle d'utilisateur
3) dans votre vue
la source
Méthode Laravel 5.6: https://laravel.com/docs/5.6/views#passing-data-to-views
Exemple, avec le partage d'une collection de modèles avec toutes les vues (AppServiceProvider.php):
la source
Vous avez deux options:
1.Partagez via la fonction de démarrage dans App \ Providers \ AppServiceProvider
public function boot() { view()->share('key', 'value'); }
Et accédez à la variable $ key dans n'importe quel fichier de vue.
Remarque: n'oubliez pas que vous ne pouvez pas accéder aux données de session, d'authentification et d'itinéraire en cours ici. Cette option n'est utile que si vous souhaitez partager des données statiques. Supposons que vous souhaitiez partager des données en fonction de l'utilisateur actuel, de l'itinéraire ou de toute variable de session personnalisée que vous ne pourrez pas faire avec cela.
'aliases' => [ ..., 'Helper' => App\HelperClass\Helper::class, ],
et créez Helper.php dans le dossier HelperClass dans le dossier App
et accédez-y partout comme
Helper::Sample()
Vous ne serez pas limité ici pour utiliser Auth, Route, Session ou toute autre classe.
la source