> For the complete documentation index, see [llms.txt](https://ajgallego.gitbook.io/laravel-5/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ajgallego.gitbook.io/laravel-5/capitulo_1/capitulo_1_vistas.md).

# Vistas

Las vistas son la forma de presentar el resultado (una pantalla de nuestro sitio web) de forma visual al usuario, el cual podrá interactuar con él y volver a realizar una petición. Las vistas además nos permiten separar toda la parte de presentación de resultados de la lógica (controladores) y de la base de datos (modelos). Por lo tanto no tendrán que realizar ningún tipo de consulta ni procesamiento de datos, simplemente recibirán datos y los prepararán para mostrarlos como HTML.

## Definir vistas

Las vistas se almacenan en la carpeta `resources/views` como ficheros PHP, y por lo tanto tendrán la extensión `.php`. Contendrán el código HTML de nuestro sitio web, mezclado con los assets (CSS, imágenes, Javascripts, etc. que estarán almacenados en la carpeta `public`) y algo de código PHP (o código *Blade* de plantillas, como veremos más adelante) para presentar los datos de entrada como un resultado HTML.

A continuación se incluye un ejemplo de una vista simple, almacenada en el fichero `resources/views/home.php`, que simplemente mostrará por pantalla `¡Hola <nombre>!`, donde `<nombre>` es una variable de PHP que la vista tiene que recibir como entrada para poder mostrarla.

```markup
<html>
    <head>
        <title>Mi Web</title>
    </head>
    <body>
        <h1>¡Hola <?php echo $nombre; ?>!</h1>
    </body>
</html>
```

## Referenciar y devolver vistas

Una vez tenemos una vista tenemos que asociarla a una ruta para poder mostrarla. Para esto tenemos que ir al fichero `routes.php` como hemos visto antes y escribir el siguiente código:

```php
Route::get('/', function()
{
    return view('home', array('nombre' => 'Javi'));
});
```

En este caso estamos definiendo que la vista se devuelva cuando se haga una petición tipo GET a la raíz de nuestro sitio. El único cambio que hemos hecho con respecto a lo que vimos en la sección anterior de rutas ha sido en el valor devuelto por la función, el cual genera la vista usando el método `view` y la devuelve. Esta función recibe como parámetros:

* El nombre de la vista (en este caso `home`), el cual será un fichero almacenado en la carpeta `views`, acordaros que la vista anterior de ejemplo la habíamos guardado en `resources/views/home.php`. Para indicar el nombre de la vista se utiliza el mismo nombre del fichero pero sin la extensión `.php`.
* Como segundo parámetro recibe un array de datos que se le pasarán a la vista. En este caso la vista recibirá una variable llamada `$nombre` con valor "Javi".

Como hemos visto para referenciar una vista únicamente tenemos que escribir el nombre del fichero que la contiene pero sin la extensión `.php`. En el ejemplo, para cargar la vista almacenada en el fichero `home.php` la referenciamos mediante el nombre `home`, sin la extensión `.php` ni la ruta `resources/views`.

Las vistas se pueden organizar en sub-carpetas dentro de la carpeta `resources/views`, por ejemplo podríamos tener una carpeta `resources/views/user` y dentro de esta todas las vistas relacionadas, como por ejemplo `login.php`, `register.php` o `profile.php`. En este caso para referenciar las vistas que están dentro de sub-carpetas tenemos que utilizar la notación tipo "*dot*", en la que las barras que separan las carpetas se sustituyen por puntos. Por ejemplo, para referenciar la vista `resources/views/user/login.php` usaríamos el nombre `user.login`, o la vista `resources/views/user/register.php` la cargaríamos de la forma:

```php
Route::get('register', function()
{
    return view('user.register');
});
```

## Pasar datos a una vista

Como hemos visto, para pasar datos a una vista tenemos que utilizar el segundo parámetro del método `view`, el cual acepta un array asociativo. En este array podemos añadir todas la variables que queramos utilizar dentro de la vista, ya sean de tipo variable normal (cadena, entero, etc.) u otro array o objeto con más datos. Por ejemplo, para enviar a la vista `profile` todos los datos del usuario cuyo `id` recibimos a través de la ruta tendríamos que hacer:

```php
Route::get('user/profile/{id}', function($id)
{
    $user = // Cargar los datos del usuario a partir de $id
    return view('user.profile', array('user' => $user));
});
```

Laravel además ofrece una alternativa que crea una notación un poco más clara. En lugar de pasar un array como segundo parámetro podemos utilizar el método `with` para indicar una a una las variables o contenidos que queremos enviar a la vista:

```php
$view = view('home')->with('nombre', 'Javi');

$view = view('user.profile')
            ->with('user', $user)
            ->with('editable', false);
```

## Vistas dentro de vistas

Laravel también permite anidar vistas, es decir, renderizar una vista dentro de otra vista. Por ejemplo, si queremos mostrar la vista almacenada en `app/views/partials/view.php` dentro de la vista que habíamos creado en el ejemplo anterior (`app/views/home.php`), tendríamos que hacer lo siguiente:

```php
$view = View::make('home')->nest('content', 'partials.view');

// También podemos pasarle datos a la vista hija...
$view = View::make('home')->nest('content', 'partials.view', $data);
```

El código anterior generaría la vista padre (`home`) y en su variable `content` colocaría la vista hija `partials.view`. Para indicar la ruta hasta vistas que están almacenadas dentro de carpetas, en lugar de escribir la barra `/` como separador se utiliza el punto (`.`).

```markup
<html>
    <body>
        <h1>¡Hola!</h1>
        <?php echo $content; ?>
    </body>
</html>
```
