Comment transmettre des données à toutes les vues Laravel 5?
je veux avoir quelques données par défaut accessibles dans toutes les vues de mon application Laravel 5.
j'ai essayé de le chercher mais je n'ai trouvé que des résultats pour Laravel 4. J'ai lu la documentation 'Sharing Data With All Views' ici mais je ne comprends pas quoi faire. Où dois le code suivant être placé?
View::share('data', [1, 2, 3]);
Merci pour votre aide.
11 réponses
Cette cible peut atteindre grâce à la méthode différente,
1. Utilisation Du Contrôleur De Base
la façon dont j'aime mettre les choses en place, je fais une classe BaseController
qui étend la propre Controller
de Laravel , et mettre en place diverses choses globales là. Tous les autres contrôleurs s'étendent alors de BaseController
plutôt que du contrôleur de Laravel.
class BaseController extends Controller
{
public function __construct()
{
//its just a dummy data object.
$user = User::all();
// Sharing is caring
View::share('user', $user);
}
}
2. En Utilisant Le Filtre
si vous savez pour un fait que vous voulez quelque chose mis en place pour les vues sur chaque demande à travers l'ensemble de l'application, vous pouvez également le faire via un filtre qui fonctionne avant la demande - c'est la façon dont je traite L'objet utilisateur dans Laravel.
App::before(function($request)
{
// Set up global user object for views
View::share('user', User::all());
});
ou
vous pouvez définir votre propre filtre
Route::filter('user-filter', function() {
View::share('user', User::all());
});
et l'appeler par simple appel de filtre.
mise à jour selon la Version 5.*
3. Utilisation Du Compositeur De Vue
View Composer aussi aider à lier des données spécifiques à visualiser de différentes façons. Vous pouvez lier directement variable à vue spécifique ou à toutes les vues. Par exemple, vous pouvez créer votre propre répertoire pour stocker votre fichier View composer selon les exigences. et ces fichiers de compositeur de vue par le Service fournissent interagir avec la vue.
voir méthode compositeur peut utiliser de manière différente, premier exemple peut se ressembler:
vous pouvez créer un répertoire App\Http\ViewComposers
.
Prestataire De Services
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
}
}
après cela, ajouter ce fournisseur à config/app.php dans la section" fournisseurs".
TestViewComposer
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class TestViewComposer {
public function compose(View $view) {
$view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
}
}
ViewName.lame.php
Here you are... {{$ViewComposerTestVariable}}
cette méthode ne peut être utile que pour une vue spécifique. Mais si vous voulez déclencher ViewComposer à toutes les vues, nous devons appliquer ce changement unique à ServiceProvider.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
}
}
référence
Pour Plus De Précisions Laracast Épisode
s'il y a encore quelque chose qui n'est pas clair de mon côté, faites-le moi savoir.
Vous pouvez créer votre propre fournisseur de services ( ViewServiceProvider
nom commun) ou vous pouvez utiliser l'existant AppServiceProvider
.
Dans votre fournisseur sélectionné, placez votre code dans la méthode d'amorçage.
public function boot() {
view()->share('data', [1, 2, 3]);
}
cela rendra une variable $data
accessible dans toutes vos vues.
si vous préférez utiliser la façade au lieu de l'aide, changez view()->
en View::
mais n'oubliez pas de use View;
en haut de votre fichier.
j'ai trouvé que c'était la plus facile. Créez un nouveau fournisseur et l'utilisateur le Joker '*'
pour l'attacher à toutes les vues. Fonctionne aussi en 5.3: -)
<?php
namespace App\Providers;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
* @return void
*/
public function boot()
{
view()->composer('*', function ($view)
{
$user = request()->user();
$view->with('user', $user);
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
la meilleure façon serait de partager la variable en utilisant View::share('var', $value);
des Problèmes avec la composition à l'aide de "*"
:
envisager l'approche suivante:
<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);
$viewFacrory->compose('*', GlobalComposer::class);
vue d'une lame d'exemple:
@for($i = 0; $i<1000; $i++)
@include('some_partial_view_to_display_i', ['toDisplay' => $i])
@endfor
que se passe-t-il?
- la classe
GlobalComposer
est instanciée 1000 temps en utilisantApp::make
. - l'événement
composing:some_partial_view_to_display_i
est traité 1000 "1519280920." - la fonction
compose
à l'intérieur de la classeGlobalComposer
est appelée 1000 fois.
mais la vue partielle some_partial_view_to_display_i
n'a rien à voir avec les variables composées par GlobalComposer
mais augmente fortement le temps de rendu.
meilleure approche?
utilisant View::share
le long d'un middleware groupé.
Route::group(['middleware' => 'WebMiddleware'], function(){
// Web routes
});
Route::group(['prefix' => 'api'], function (){
});
class WebMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
mise à Jour
si vous utilisez quelque chose qui est calculé sur le pipeline middleware, vous pouvez tout simplement écouter à la bonne événement ou mettre la vue partager middleware au dernier fond du pipeline.
dans la documentation:
typiquement, vous placeriez des appels à la méthode de l'action dans un service méthode de démarrage du fournisseur. Vous êtes libre de les ajouter à la Fournisseur d'applications ou générer un fournisseur de services distinct pour héberger ils.
Je suis d'accord avec Marwelln, il suffit de le mettre dans AppServiceProvider
dans la fonction de démarrage:
public function boot() {
View::share('youVarName', [1, 2, 3]);
}
je recommande d'utiliser un nom spécifique pour la variable, à évitez les confusions ou les erreurs avec d'autres variables "globales".
La documentation est d'entendre https://laravel.com/docs/5.4/views#view-composers mais je vais décomposer
-
recherchez le répertoire app\Providers dans le répertoire racine de votre application et créez le fichier ComposerServiceProvider.php et de copier et coller le texte ci-dessous et l'enregistrer.
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider { /** * Register bindings in the container. * * @return void */ public function boot() { // Using class based composers... View::composer( 'profile', 'App\Http\ViewComposers\ProfileComposer' ); // Using Closure based composers... View::composer('dashboard', function ($view) { // }); } /** * Register the service provider. * * @return void */ public function register() { // } }
-
de la racine de votre application, ouvrez Config / app.php et rechercher la section fournisseurs dans le fichier et la copie et passer ce 'App\Providers\ComposerServiceProvider', au tableau.
ce faisant, nous avons créé le fournisseur de services de compositeur. Lorsque vous exécutez votre application avec le profil de vue comme http://yourdomain/something/profile , le fournisseur de services ComposerServiceProvider est appelé et la classe App\Http\ViewComposers\ProfileComposer est instanciée appelant le compositeur de la méthode en raison du code ci-dessous à l'intérieur de la méthode d'amorçage ou de la fonction.
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
- Si vous actualisez votre demande, vous obtenez un message d'erreur parce que la classe App\Http\ViewComposers\ProfileComposer n'existe pas encore. Maintenant, je vous propose de le créer.
Allez dans le chemin d'accès au répertoire app/Http
-
créer le répertoire appelé Viewcomposeurs
-
créer le fichier ProfileComposer.php .
class ProfileComposer { /** * The user repository implementation. * * @var UserRepository */ protected $users; /** * Create a new profile composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // Dependencies automatically resolved by service container... $this->users = $users; } /** * Bind data to the view. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); } }
maintenant, allez à votre avis ou dans le présent profil.lame.php et ajouter
{{ $count }}
et de montrer le nombre d'utilisateurs sur la page de profil.
pour afficher le compte sur toutes les pages changer
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
à
// Using class based composers...
View::composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);
je pense que la meilleure façon est avec View Composers
. Si quelqu'un est venu ici et que vous voulez trouver comment faire avec View Composers way, lire ma réponse => comment partager une variable à travers toutes les vues?
la documentation est hear https://laravel.com/docs/5.4/views#view-composers mais je vais le décomposer 1.Recherchez les fournisseurs de répertoires dans votre répertoire racine et créez le For ComposerServiceProvider.php avec le contenu
dans votre dossier config vous pouvez créer un nom de fichier php par exemple" variable.php "avec le contenu ci-dessous:
<?php
return [
'versionNumber' => '122231',
];
maintenant dans toutes les vues vous pouvez utiliser config('variable.versionNumber')
pour appeler cette variable.
ajoutez-les au fournisseur de Services App dans la méthode boot
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
View::share('signedIn', \Auth::check());
View::share('user', \Auth::user());
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
Laravel 5.6 méthode: https://laravel.com/docs/5.6/views#passing-data-to-views
exemple, avec partage d'une collection de modèles à toutes les vues (AppServiceProvider.php):
use Illuminate\Support\Facades\View;
use App\Product;
public function boot()
{
$products = Product::all));
View::share('products', $products);
}