Laravel 5-variable global Blade view disponible en todas las plantillas


¿Cómo puedo hacer en Laravel 5 una variable global que estará disponible en todas las plantillas de Blade?

Author: Limon Monte, 2015-04-18

6 answers

Opción 1:

Puedes usar view::share() así:

<?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');
    }

}

Opción 2: Usa un compositor:

  1. Crear un archivo composer en app\Composers\HomeComposer.php

NB: crear app\Composers si no existe

<?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');
    }
}

A Continuación, puede adjuntar el compositor a cualquier vista haciendo esto

<?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');
    }

}
 64
Author: Digitlimit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-14 14:12:49

Crear un nuevo Proveedor de Servicios como se sugiere aquí

Agregue su nuevo Proveedor de servicios al archivo de configuración (config/app.php).

En el método de arranque de su nuevo Proveedor de Servicios use:

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

Ahora está listo para usar someth something_cool en todas sus vistas.

Espero que esto ayude.

 19
Author: Nic Gutierrez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-28 17:30:43

Buscando la solución del mismo problema y encontrado la mejor solución en la documentación de Laravel. Solo usa View::share en AppServiceProvider así:

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

Detalles aquí.

 9
Author: sha-1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-17 12:20:31

Puede hacer esto con view composers. Los compositores de vista se ejecutan cuando se carga una plantilla. Puede pasar un cierre con funcionalidad adicional para esa vista. Con view composers puedes usar comodines. Para crear una vista composer para cada vista solo use un *.

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

También puede hacer esto sin un cierre como se puede ver en los documentos.

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

La clase profile composer debe tener un método de composición.

Los compositores de vistas se ejecutan cuando renderizar. Laravel también tiene creadores de vistas. Estos son ejecutados cuando la vista se crea una instancia.

También puede elegir usar un BaseController con un método setupLayout. Luego, cada vista que cargará se carga a través del método setupLayout, que agrega algunos datos adicionales. Sin embargo, al usar view composers estás bastante seguro de que el código se ejecuta. Pero con el enfoque de BaseController tiene más flexibilidad porque puede omitir la carga de los datos adicionales.

EDITAR: Como se menciona por Nic Gutiérrez también puedes usar view share.

 7
Author: ArjanSchouten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-18 11:28:17

También puedes hacer esto en el archivo Route.php:

view()->share('variableName', $variable);
 3
Author: Jodeveloper8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-10 14:39:23

Puede flashearlo en la sesión, puede definirlo en el .env file (vars estáticos)

 -6
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-18 15:07:47