web-dev-qa-db-fra.com

Comment transmettre des données à toutes les vues dans Laravel 5?

Je souhaite que certaines données par défaut soient accessibles dans toutes les vues de mon application Laravel 5.

J'ai essayé de chercher, mais je n'ai trouvé 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ù faut-il placer le code suivant?

View::share('data', [1, 2, 3]);

Merci de votre aide.

88
Ragnarsson

Cet objectif peut être atteint par différentes méthodes,

1. Utilisation de BaseController

Si j’aime organiser les choses, je crée une classe BaseController qui étend la propre variable Controller de Laravel et y installe diverses choses globales. Tous les autres contrôleurs s’étendent alors de BaseController plutôt que de Laravel’s Controller. 

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();

    // Sharing is caring
    View::share('user', $user);
  }
}

2. Utilisation du filtre

Si vous savez avec certitude que vous souhaitez que quelque chose soit configuré pour afficher des vues sur chaque demande dans l'ensemble de 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.

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 appelez-le via un filtre simple.

Mise à jour selon la version 5. *

3. Utilisation de middleware

Utiliser le View::share avec middleware

Route::group(['middleware' => 'SomeMiddleware'], function(){
  // routes
});



class SomeMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

4. Utilisation de View Composer

View Composer aide également à lier des données spécifiques pour les 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 compositeur de vues en fonction des besoins. et ceux-ci visualisent le fichier du compositeur via le service fournissent une interaction avec la vue.

La méthode View Composer peut utiliser différentes méthodes. Le premier exemple peut se ressembler:

Vous pouvez créer un répertoire App\Http\ViewComposers

Fournisseur 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, ajoutez ce fournisseur à config/app.php sous 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.blade.php

Here you are... {{$ViewComposerTestVariable}}

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 modification 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

Documentation Laravel

Pour plus de précisions Épisode Laracast

Si encore quelque chose d'incertain de mon côté, faites le moi savoir.

161
Safoor Safdar

Vous pouvez créer votre propre fournisseur de service } _ (le nom ViewServiceProvider est commun) ou vous pouvez utiliser la AppServiceProvider existante.

Dans votre fournisseur sélectionné, insérez votre code dans la méthode de démarrage.

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 à la place de l'assistant, remplacez view()-> par View::, mais n'oubliez pas de placer use View; en haut de votre fichier.

50
Marwelln

J'ai trouvé que c'était le plus facile. Créez un nouveau fournisseur et utilisez le caractère générique '*' 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()
    {
        //
    }
}
8
Stan Smulders

Le meilleur moyen serait de partager la variable en utilisant View::share('var', $value);

Problèmes de composition avec "*":

Envisagez l'approche suivante:

<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);

$viewFacrory->compose('*', GlobalComposer::class);

À partir d'un exemple de vue de lame:

  @for($i = 0; $i<1000; $i++)
    @include('some_partial_view_to_display_i', ['toDisplay' => $i])
  @endfor

Ce qui se produit?

  • La classe GlobalComposer est instanciée 1000 fois à l'aide de App::make
  • L'événement composing:some_partial_view_to_display_i est géré 1000 fois.
  • La fonction compose 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 considérablement le temps de rendu.

_ {Meilleure approche?} _

Utiliser View::share avec 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());
  }
}

Mettre à jour

Si vous utilisez quelque chose qui est calculé sur le pipeline de middleware, vous pouvez simplement écouter accéder au événement approprié ou placer le middleware de partage de vues au dernier bas du pipeline.

4
Reza Shadman

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

  1. Recherchez le répertoire app\Providers dans le répertoire racine de votre application, créez le fichier ComposerServiceProvider.php, copiez-collez-y le texte ci-dessous et enregistrez-le.

    <?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. À la racine de votre application, ouvrez Config/app.php et recherchez la section Fournisseurs dans le fichier, puis copiez-la et collez-la 'App\Providers\ComposerServiceProvider', du tableau.

Ce faisant, nous avons créé le fournisseur de services Composer. Lorsque vous exécutez votre application avec la vue Profil comme suit http: // votre domaine/quelque chose/votre profil, le fournisseur de services ComposerServiceProvider est appelé et la classe App\Http\ViewComposers\ProfileComposer est instancié en appelant la méthode Composer en raison du code ci-dessous contenu dans la méthode ou la fonction de démarrage.

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. Si vous actualisez votre application, vous obtiendrez une erreur car la classe App\Http\ViewComposers\ProfileComposer n'existe pas encore. Maintenant, créons-le.

Accédez au chemin du répertoire app/Http

  • Créez le répertoire appelé ViewComposers

  • Créez 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 vue ou dans ce cas Profile.blade.php et ajoutez

{{ $count }}

et cela montrera le nombre d'utilisateurs sur la page de profil. 

Pour afficher le nombre 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'
);
3

Dans la documentation:

Généralement, vous appelez la méthode de partage dans un service méthode de démarrage du fournisseur. Vous êtes libre de les ajouter au AppServiceProvider ou générer un fournisseur de service distinct pour héberger leur.

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 afin d'éviter toute confusion ou erreur avec d'autres variables non "globales".

3

Dans votre dossier de configuration, vous pouvez créer un fichier php en le nommant 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.

1
Mehran

Je pense que la meilleure façon est avec View Composers. Si quelqu'un est venu ici et veut savoir comment faire avec View Composers, lisez ma réponse => Comment partager une variable entre toutes les vues?

1

La documentation est entendue https://laravel.com/docs/5.4/views#view-composers mais je vais la décomposer 1. Recherchez le répertoire Providers dans votre répertoire racine et créez le pour ComposerServiceProvider .php avec contenu

1

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

use Illuminate\Support\Facades\View;
use App\Product;

public function boot()
{
    $products = Product::all();
    View::share('products', $products);

}
0
Alexander Kim