laravel-5-view-composers

Un View Composer es un método que se ejecuta cada vez que llamamos a una vista, puede ser muy útil a la hora de querer mostrar información común en varios métodos sin tener que repetir muchas líneas de código dentro de todos los controladores.

Veamos un pequeño ejemplo sobre su uso partiendo desde lo mas básico y usando el boilerplate que Laravel nos ofrece en cada instalación o creación de un nuevo proyecto.

Configurar base de datos

Usaremos la migracion Users que viene por defecto en cada instalacion de laravel, para ello agregamos primero las credenciales de acceso al archivo .env

DB_HOST=localhost
DB_DATABASE=composers
DB_USERNAME=root
DB_PASSWORD=

Luego ejecutamos

$ php artisan migrate

Para mas informacion sobre el uso de migraciones te recomiendo el tutorial sobre Creando Migraciones en Laravel 5

Creando usuarios de prueba

Podemos hacer esto usando el método faker explicado en el tutorial Seeders y el componente Faker en Laravel 5, pero por ahora lo mantendremos simple ingresando a la url del proyecto y creándolos manualmente  urldetuproyecto/public/auth/register

laravel-5-register

Registrando un nuevo Service Provider

Lo primero que debemos hacer es crear un nuevo service provider en nuestra aplicacion

$ php artisan make:provider ComposerServiceProvider

Luego lo agregamos al array de providers dentro de app/config.php

'App\Providers\ComposerServiceProvider',

Llamando la clase desde ComposerServiceProvider

Lo ideal es crear una nueva clase que se encargue de todos los métodos y funciones que devuelven los valores que deseamos a la vista, por lo tanto en el service provider no vamos a crear ninguna función, solo haremos el llamado a la clase encargada de esto.

Las clases deben incluirse dentro del metodo boot() de la siguiente manera

public function boot()
{
     View::composer('welcome', 'App\Http\ViewComposers\ProfileComposer');
}

Recuerda importar la clase

use Illuminate\Support\Facades\View;

ProfileComposer será el nombre de la clase encargada de devolver los valores a la vista, y la creamos dentro del directorio App/Http/ViewComposers.

Esta clase se ejecutara únicamente para la vista wellcome (wellcome.blade.php).

Incluyendo varias vistas en el Service Provider

Si deseamos que la clase se ejecute para mas de una vista podemos pasar un arreglo de vistas editando la función boot

View::composer([‘welcome’,’home’,’login’], 'App\Http\ViewComposers\ProfileComposer');

Agrupando View Composers

También se pueden llamar varios composers desde este service provider para una o mas vistas desde el método boot

View::composers(['App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'],
    'App\Http\ViewComposers\UserComposer' => 'user',
    'App\Http\ViewComposers\ProductComposer' => 'product',
    'App\Http\ViewComposers\ProfileComposer' => 'welcome'
]);

de esta forma le indicamos que composer se debe ejecutar para cada vista.

Creando la clase ProfileComposer

En este caso solo pasaremos a la vista una variable llamada “count” con la cantidad de usuarios registrados en el sistema

<?php namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use App\User as User;

class ProfileComposer {
    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $users = User::all();
        $view->with('count', $users->count());
    }

}

Nota: si obtienes un error del tipo ClassNotFound prueba ejecutando en la consola

$ composer dump-autoload

Mostrando el resultado en la vista

Hasta ahora todo va bien, pero solo le hemos indicado a la aplicacion que cada vez que se cargue la vista wellcome, se ejecute el ProfileComposer y devuelva una variable llamada “count”, ahora debemos imprimir dicha variable, para ello vamos a editar un poco el archivo wellcome.blade.php

	<body>
		<div class="container">
			<div class="content">
				<div class="title">We are {{ $count }} users now</div>

			</div>
		</div>
    </body>

Resultado final

Desde ahora cada vez que entremos al directorio public veremos algo como esto

wellcome-blade-view-compose

Podemos realizar métodos más complejos y enviar tantos datos, objetos o arreglos queramos enviar a cada vista sin sobrecargar todos los controladores de la aplicación.

Tutoriales recomendados

Información adicional en la documentación oficial de framework

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Aprende a usar Eloquent el ORM de Laravel Lección siguiente URLs amigables y rutas con slugs en Laravel