Vistas

Uso básico

Las vistas contienen el HTML que provee tu aplicación y separa la lógica de controlador / aplicación de la capa de presentación. Las vistas se almacenan en el directorio resources/views.

Una vista simple podría ser similar a esto:

<!-- Vista almacenada en resources/views/greeting.php -->

<html>
    <body>
        <h1>Hola, <?php echo $name; ?></h1>
    </body>
</html>

Puesto que esta vista se encuentra en resources/views/greeting.php, podemos retornarla utilizando la función helper global view así:

Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

Como puedes ver, el primer argumento que se pasa al helper view corresponde al nombre del archivo de la vista en el directorio resources/views. El segundo parámetro es un array de los datos que deberán estar disponibles en la vista. En este caso, estamos pasando la variable name, que se mostrará en la vista si hacemos un echo de ella.

Por supuesto, las vistas también pueden almacenarse en subdirectorios alojados dentro de resources/views. La notación de "puntos" o "dot notation" se utiliza para hacer referencia a vistas anidadas. Por ejemplo, si la vista está almacenada en resources/views/admin/profile.php, se referencia así:

return view('admin.profile', $data);

Determinar si existe una vista

Para determinar si una vista existe, se puede utilizar el método exists después de llamar al helper view si ningún argumento. Este método retornará true si la vista existe:

if (view()->exists('emails.customer')) {
    //
}

Cuando se llama al helper view sin argumentos, se retorna una instancia de Illuminate\Contracts\View\Factory, permitiendo el acceso a cualquier método del factory.

Datos en vistas

Pasar datos a vistas

Como se ha visto en ejemplos anteriores, se puede pasar sencillamente un array de datos a las vistas:

return view('greetings', ['name' => 'Victoria']);

Cuando pasamos información de esta forma, $data debe contener un array con pares clave/valor. Dentro de la vista, se puede acceder a cada valor utilizando su clave correspondiente, tal como <?php echo $key; ?>. Como alternativa a pasar un array de datos al helper view, se pueden pasar piezas individuales de datos a la vista utilizando el método with:

$view = view('greeting')->with('name', 'Victoria');

Compartir datos con todas las vistas

Algunas veces, puede surgir la necesidad de compartir ciertos datos en todas las vistas de la aplicación. Esto se puede hacer utilizando el método share. Por lo general, las llamadas al método share se hacen dentro del método boot de un service provider. Puedes añadirlas en AppServiceProvider o generar un service provider independiente para alojarlas:

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        view()->share('key', 'value');
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Compositores de vistas (View composers)

Los view composers son callbacks o un método de una clase que son llamados cuando una vista es renderizada. Si hay datos para vincular a una vista cada vez que esta sea procesada, un view composer ayuda a organizar ese código en una sola ubicación.

Registremos un view composer dentro de un service provider. Utilizaremos el helper view para acceder a la implementación del contrato Illuminate\Contracts\View\Factory. Recuerda, Laravel no incluye un directorio por defecto para view composers. Puede almacenarse en el lugar que más proceda. Por ejemplo, en el directorio App\Http\ViewComposers:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Usando composers basados en clases...
        view()->composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );

        // Usando funciones anónimas...
        view()->composer('dashboard', function ($view) {

        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Recuerda, si se crea un service provider nuevo que contenga registros de view composer, hay que añadirlo al array providers del archivo de configuración config/app.php.

Ahora que hemos registrado el composer, el método ProfileComposer@compose se ejecutará cada vez que la vista profile vaya a ser procesada. Entonces, definamos la clase composer:

<?php

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as UserRepository;

class ProfileComposer
{
    /**
     * Implementación del repositorio del usuario.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Crear un nuevo composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Las dependencias son resueltas automáticamente por el service container...
        $this->users = $users;
    }

    /**
     * Asociar datos a la vista.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

Justo antes de que la vista se procese, se llama al método compose del composer con la instancia Illuminate\Contracts\View\View. Puedes utilizar el método with para adjuntar datos a la vista.

Nota: Todos los view composers se resuelven a través del service container, así que puedes type-hint cualquier dependencia en el constructor del composer.

Adjuntar un composer a múltiples vistas

Puedes vincular un view composer a múltiples vistas de una vez pasando un array de estas como primer argumento al método composer:

view()->composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

El método composer acepta el carácter * como comodín, permitiendo vincular todas las vistas:

view()->composer('*', function ($view) {
    //
});

Creadores de vistas (View creators)

Los view creators son similares a los composers; sin embargo, se disparan inmediatamente cuando una vista se instancia en lugar de esperar hasta que esté a punto de renderizar. Para registrar un view creator, simplemente se utiliza el método creator:

view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');