web-dev-qa-db-fra.com

Laravel 5 - variable de vue globale de la lame disponible dans tous les modèles

Comment puis-je entrer Laravel 5 créer une variable globale qui sera disponible dans tous les modèles de lames?

55
Limon Monte

Option 1:

Vous pouvez utiliser view::share() comme ceci:

<?php namespace App\Http\Controllers;

use View;

//You can create a BaseController:

class BaseController extends Controller {

    public $variable1 = "I am Data";

    public function __construct() {

       $variable2 = "I am Data 2";


       View::share ( 'variable1', $this->variable1 );
       View::share ( 'variable2', $variable2 );
       View::share ( 'variable3', 'I am Data 3' );
       View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
    }  

}

class HomeController extends BaseController {

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:

    public function __construct(){
       parent::__construct();
    }

    public function Index(){
      //All variable will be available in views
      return view('home');
    }

}

Option 2: Utilisez un compositeur:

  1. Créez un fichier composer à app\Composers\HomeComposer.php

NB: créer app\Composers s'il n'existe pas

<?php namespace App\Composers;

class HomeComposer
{

    public function compose($view)
    {
        //Add your variables
        $view->with('variable1',      'I am Data')
             ->with('variable2',      'I am Data 2');
    }
}

Ensuite, vous pouvez attacher le composer à n'importe quelle vue en faisant cela)

<?php namespace App\Http\Controllers;

use View;

class HomeController extends Controller{


    public function __construct(){

        View::composers([
            'App\Composers\HomeComposer'  => ['home'] //attaches HomeComposer to home.blade.php
        ]);

    }

    public function Index(){
        return view('home');
    }

}
75
Emeka Mbah

Créer un nouveau fournisseur de service comme suggéré ici

Ajoutez votre nouveau fournisseur de services au fichier de configuration (config/app.php).

Dans la méthode de démarrage de votre nouvelle utilisation du fournisseur de service:

View::share( 'something_cool', 'this is a cool shared variable' );

Vous êtes maintenant prêt à utiliser $ quelque chose_cool dans toutes vos vues.

J'espère que cela t'aides.

27
Nic Gutierrez

Rechercher la solution du même problème et trouver la meilleure solution dans la documentation de Laravel. Utilisez simplement View::share dans AppServiceProvider comme ceci:

View::share('key', 'value');

Détails ici .

11
sha-1

Vous pouvez le faire avec view composers . Les compositeurs View sont exécutés lorsqu'un modèle est chargé. Vous pouvez transmettre une fermeture avec des fonctionnalités supplémentaires pour cette vue. Avec les compositeurs de vue, vous pouvez utiliser des caractères génériques. Pour créer une vue composer pour chaque vue, utilisez simplement un *.

View::composer('*', function($view)
{
    $view->with('variable','Test value');
});

Vous pouvez également le faire sans fermeture, comme vous pouvez le voir dans la documentation.

View::composer('*', 'App\Http\ViewComposers\ProfileComposer');

Le profil composer) doit avoir une méthode de composition.

Les compositeurs de vue sont exécutés lorsqu'une vue est rendue. Laravel inclut également des créateurs de vues. Celles-ci sont exécutées lorsqu'une vue est instanciée.

Vous pouvez également choisir d'utiliser BaseController avec une méthode setupLayout. Chaque vue que vous allez charger est ensuite chargée via la méthode setupLayout, qui ajoute des données supplémentaires. Cependant, en utilisant des compositeurs de vue, vous êtes à peu près sûr que le code est exécuté. Mais avec l'approche BaseController, vous avez plus de flexibilité car vous pouvez ignorer le chargement des données supplémentaires.

EDIT: Comme mentionné par Nic Gutierrez, vous pouvez également utiliser le partage de vue.

10
ArjanSchouten

En outre, vous pouvez le faire dans le Route.php fichier:

view()->share('variableName', $variable);
3
Jodeveloper8

Je préférerais utiliser un middleware avec l'aide de façade view(). (Laravel 5.x)

Le middleware est plus facile à gérer et ne crée pas de désordre dans l’arborescence des classes des contrôleurs.

Pas

Créer le middleware

/app/Http/Middleware/TimezoneReset.php

Pour créer un middleware, vous pouvez exécuter php artisan make:middleware GlobalTimeConfig

share() les données dont vous avez besoin d'être partagées

 <?php

    namespace App\Http\Middleware;

    use Closure;

    class GlobalTimeConfig
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $time_settings = [
                'company_timezone' => 'UTC',
                'company_date_format' => 'Y-m-d H:i:s',
                'display_time' => true,
            ];

            view()->share('time_settings', $time_settings);

            return $next($request);
        }
    }

Enregistrer le middleware nouvellement créé

Ajoutez le middleware à votre groupe de routes de middleware selon l'exemple ci-dessous

/app/Http/Kernel.php

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\GlobalTimeConfig::class,
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

Accéder aux données des modèles

Accédez aux données de n'importe quel modèle avec la clé donnée dans l'appel de méthode View :: share ()

par exemple.:

    Company timezone: {{ $time_settings['company_timezone'] }}

EDIT : La réponse du fournisseur de services de Nic Gutierrez pourrait être une meilleure (ou la meilleure) solution.

0
Gabi Dj

et vous pouvez donner tableau non seulement View::share('key', 'value'); peut mettre un tableau comme View::share(['key'=>'value','key'=>'value'])

0
Ehab Elzeny