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.

70
demandé sur Ragnarsson 2015-02-19 17:11:07

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

Laravel Documentation

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.

135
répondu Safoor Safdar 2017-09-11 13:45:12

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.

48
répondu Marwelln 2015-02-19 14:51:15

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()
    {
        //
    }
}
7
répondu Stan Smulders 2016-09-28 11:07:22

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 utilisant App::make .
  • l'événement composing:some_partial_view_to_display_i est traité 1000 "1519280920."
  • la fonction compose à l'intérieur de la classe GlobalComposer 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.

3
répondu Reza Shadman 2016-11-22 11:53:52

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".

2
répondu Santiago Mendoza Ramirez 2015-02-19 14:56:48

La documentation est d'entendre https://laravel.com/docs/5.4/views#view-composers mais je vais décomposer

  1. 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()
        {
            //
        }
    }
    
  2. 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'
 );
  1. 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'
);
2
répondu Samuel Kwame Antwi 2017-04-08 16:04:15

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?

0
répondu Panagiotis Koursaris 2017-05-23 12:34:39

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

0
répondu Samuel Kwame Antwi 2017-04-08 14:39:01

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.

0
répondu Mehran 2018-04-08 03:43:11

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()
    {
        //
    }
}
0
répondu Nasser Ali Karimi 2018-04-11 06:01:10

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);

}
0
répondu Alexander Kim 2018-06-30 10:04:23