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
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
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
- Aprende Laravel 5: Instalación y uso de Composer
- Tutorial Básico de Blade, el sistema de plantillas de Laravel
- Aprende a usar Eloquent el ORM de Laravel
- Qué son los Service Providers de Laravel y cómo usarlos
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