kozmoz3
11/30/2017 - 3:18 AM

Al desarrollar aplicaciones para la web, nos encontramos en ocasiones con la necesidad de incluir ciertos parámetros o variables comunes en

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.

#imprimir el nombre de un usuario logueado

{{ 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.

#array de enlaces para construir un menú.

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

PHP

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