injection-blade-laravel-5-1

Al desarrollar aplicaciones para la web, nos encontramos en ocasiones con la necesidad de incluir ciertos parámetros o variables comunes en diferentes vistas del proyecto, como pueden ser menús dinámicos, meta-tags, estadísticas, y otros. Muchas veces cometemos el error de enviar estos valores a cada vista desde cada controlador que usemos, lo que ocasiona indudablemente una redundancia de código.

En Laravel tenemos varias opciones que pueden ayudar a escribir mejor las aplicaciones manteniendo separadas las responsabilidades de las vistas y los controladores, por ejemplo si queremos imprimir el nombre de un usuario logueado, no debemos enviarlo como una variable desde un controlador, solo accedemos a esa información desde blade con algo como

{{ Auth::user()->name }}

Pero en situaciones más complicadas, podemos hacer uso de los view composers, que eran una forma para indicarle al sistema que datos debía cargar al momento de llamar a una o varias vistas determinadas, manteniendo así un código limpio en los controladores y sin necesidad de recargar las vistas de código PHP.

En Laravel 5.1 se ha incluido un nuevo método que permite inyectar servicios (Clases) en cualquiera de las vistas de nuestra aplicación,  con lo cual nos podemos ahorrar el uso de los views composers cuando no sea requerido.

Veamos un ejemplo

Vamos a crear una nueva clase que devuelva un array de enlaces para construir un menú.

$ php artisan make:controller MenuController

y dentro un método  llamado links

public function links() {
    $links = [
        ['name' => 'jobs', 'url' => url('jobs') ],
        ['name' => 'series', 'url' => url('series') ],
        ['name' => 'courses', 'url' => url('courses') ],
    ];
    return $links;
}

Esta clase puede hacer una consulta a una tabla en base de datos y devolver una colección de Eloquent, en este caso mantendremos el ejemplo simple con el uso de este array.

si usamos el template welcome que trae por defecto la instalacion de Laravel 5.1 podemos hacer algo como lo siguiente

//inyectamos la clase

@inject('menu','App\Http\Controllers\MenuController')
    <ul>
        @foreach($menu->links() as $link)
            <li><a href="{{ $link['url'] }}">{{ $link['name'] }}</a></li>
        @endforeach
    </ul>

Al final obtendremos una respuesta como esta

inject-blade-home

Este sencillo ejemplo te da una idea de como funciona el nuevo método para inyección de servicios de blade.

Te invito a mantenerte al día con nuestras publicaciones diarias, espero que te haya gustado este post y no olvides dejar tus dudas y comentarios.

Lecturas recomendadas

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

Lección anterior Integrar Bootstrap 3 en Laravel 5.1 Lección siguiente Sistema de autenticación en Laravel 5.1