¿Cómo puedo en Laravel 5 realice variable global, que estará disponible en toda la Hoja de plantillas?

InformationsquelleAutor Limon Monte | 2015-04-18

9 Comentarios

  1. 76

    Opción 1:

    Puede utilizar 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:
    El uso de un compositor:

    1. Crear un compositor archivo 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');
        }
    
    }
    • Su respuesta realmente me ayudó con la Opción 1, aunque lo que si usted está tratando de acceder a $user = Auth::user(); y pase de los $variable de usuario a todos los de la hoja de plantillas, incluyendo el encabezado y la parte de contenido? He intentado esto por poner el $variable de usuario en el BaseController y, a continuación, compartirlo, pero si me var_dump $usuario tengo un montón de protegida de los valores de la matriz. Básicamente quiero ser capaz de acceder a todos los de la autenticación de usuario de variables a través de la aplicación en todas las plantillas y vistas. Parece simple, pero han pasado horas tratando de averiguar.
    • En realidad esto funcionó: <?= $user['name']; ?> pero esto no funcionó: {{ $user->name }}
    • Priddle Esto debería funcionar para una matriz {{ $user['name'] }} aunque esto funciona para un objeto {{ $user->name }}
    • Para la opción 1 de recibir: Class 'App\Http\Controllers\View' not found
  2. 28

    Crear un nuevo Proveedor de Servicio, como se sugiere en aquí

    Añadir a su nuevo Proveedor de Servicio para el archivo de configuración (config/app.php).

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

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

    Ahora está listo para usar $something_cool en todos sus puntos de vista.

    Espero que esto ayude.

    • además, es la solución definitiva para variables utilizadas en múltiples occasionson una página 503 después de artisan down. la Inyección de una aplicación de la cadena de versión como caché de buster parámetro o tener que aparece en el pie de página, mientras que la actualización es una tarea con otras soluciones. (el uso de un env variable para la que probablemente sería la solución más limpia, aunque)
    • esta es una mejor solución que la que aprobó respuesta
    • Creo que la principal diferencia es que el usuario se está haciendo acerca de cómo tener un la variable disponible en todas las plantillas. Con la aceptación de la solución de las necesidades de los usuarios a recordar a extender BaseController y llamar a los padres::construir y con el ViewComposer solución que necesita para llamar a la Vista::compositores en cada controlador de construir método para hacer que las variables disponibles.
    • Este debe ser escogida como una respuesta!
  3. 11

    La búsqueda de solución de un mismo problema y encontrar la mejor solución en la documentación de Laravel. Sólo uso View::share en AppServiceProvider como este:

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

    Detalles aquí.

  4. 10

    Usted puede hacer esto con ver compositores. Ver compositores se ejecutan cuando una plantilla se carga. Puede pasar un Cierre con funcionalidad adicional para que la vista. Con vista a los compositores que usted puede utilizar caracteres comodín. Para hacer que la vista compositor para cada vista sólo tiene que utilizar un *.

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

    También se puede hacer esto sin un cierre como se puede ver en la documentación.

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

    El perfil compositor de la clase debe tener un método de componer.

    Ver compositores se ejecutará cuando la vista se representa. Laravel también ha de vista de los creadores. Estos son ejecutados cuando la vista se crea una instancia.

    También puede elegir el uso de un BaseController con un setupLayout método. A continuación, cada ver que va a cargar se carga a través de la setupLayout método que añade algunos datos adicionales. Sin embargo, mediante el uso de la vista de los compositores que usted está bastante seguro de que el código es ejecutado. Pero con el BaseController enfoque que usted haya más flexibilidad porque puede omitir la carga de los datos adicionales.

    EDIT: Como se ha mencionado por Nic Gutiérrez también puede utilizar la vista de compartir.

    • La diferencia entre este y view()->share es que esto sólo se ejecuta cuando una vista, pero con view()->share se corrió, no importa lo que podría ser la devolución de parte de JSON en una llamada a la API por ejemplo – que no utiliza un punto de vista.
  5. 0

    y usted puede dar a la serie no sólo View::share('key', 'value');
    puede poner a la matriz como View::share(['key'=>'value','key'=>'value'])

  6. 0

    Prefiero utilizar el middleware con el view() fachada ayudante. (Laravel 5.x)

    Middleware es más fácil de mantener y no hacer un lío en los controladores de clase de árbol.

    Pasos

    Crear el Middleware

    /app/Http/Middleware/TimezoneReset.php

    Para crear un middleware puede ejecutar php artisan make:middleware GlobalTimeConfig

    share() los datos que necesita compartido

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

    Registro de la recién creada middleware

    Añadir el middleware para su middleware grupo de rutas como por ejemplo debajo de

    /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',
            ],
        ];

    Acceso a los datos de las plantillas

    Acceder a los datos desde cualquier plantilla con la clave dada en la Vista::compartir() llamada al método

    ej.:

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

    EDITAR:
    Nic Gutiérrez Proveedor de Servicios de respuesta podría ser mejor (o la mejor) de la solución.

  7. -2

    Puede agregar en Controller.php de archivo:

    use App\Category;

    Y luego:

    class Controller extends BaseController {
         public function __construct() {
            $categories = Category::All();
            \View::share('categories', $categories);
         }
    }
  8. -7

    puede flashear en la sesión, se puede definir en el .env archivo (estático de vars)

Dejar respuesta

Please enter your comment!
Please enter your name here