¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Trabajando con vistas en Laravel
Las vistas se sitúan en la carpeta resources/views. Los ficheros que hacen de vistas terminan en .blade.php. Esto es porque utilizan el motor plantillas Blade que viene incluido con Laravel.
Creación de vistas
Podemos crearla manualmente guardando el fichero terminado en .blade.php en la carpeta resources/views o utilizando artisan:
php artisan make:view home
Una vista puede ser un fichero tan simple como:
<!-- Vista almacenada en resources/views/home.blade.php --> <html> <body> <h1>Hola, {{ $nombre }}</h1> </body> </html>
Usando vistas en los controladores
namespace App\Http\Controllers; use Illuminate\Http\Request; class HomeController extends Controller { public function __invoke() { return view('home'); // 'view' es un "helper" de Laravel para llamar a una vista } }
El fichero routes/web.php lo tenemos así:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\HomeController; use App\Http\Controllers\PostController; Route::get('/', [HomeController::class, 'index']);
Una práctica recomendable, por convención, es nombrar a las vistas como el método del controlador que la llama. Por ejemplo, supongamos que tenemos el siguiente controlador:
namespace App\Http\Controllers; use Illuminate\Http\Request; class PostController extends Controller { public function index() { return "Aquí irán los posts"; } public function create() { return "Aquí se mostrará un formulario para crear un post"; } public function show($post) { return "Aquí se mostrará el post {$post}"; } }
Entonces crearíamos las vistas index.blade.php, create.blade.php, show.blade.php y show.blade.php. Por organización, queremos que las cree en una carpeta llamada posts ya que todas tienen que ver con lo mismo:
php artisan make:view posts.index php artisan make:view posts.create php artisan make:view posts.show
Ahora haría modificaciones en el controlador para llamar a las vistas creadas:
namespace App\Http\Controllers; use Illuminate\Http\Request; class PostController extends Controller { public function index() { return view("posts.index"); } public function create() { return view("posts.create"); } public function show($post) { // Para pasarle variables a un vista, la añadimos a un array // como segundo argumento del "helper" 'view' return view("posts.show", [ 'post' => $post ]); } }
La vista show.blade.php es un poco especial porque muestra información variable:
<p>Aquí se mostrará el post {{ $post }}</p>
Si no usásemos las etiquetas de Blade, mostraríamos el contenido de esa variable como hacemos en PHP:
<p>Aquí se mostrará el post <?php echo $post; ?></p>
Para pasarle argumentos a una vista desde un controlador, también podemos usar la función compact():
// ... código public function show($post) { return view("posts.show", compact('post'));
La función compact() genera un array con la clave llamada como el argumento y el dato también, pero con el símbolo de dólar, que indica que se trata de una variable. Es decir, compact('post') creará el siguiente array:
['post' => $post];
Enviando y mostrando información en vistas
Sabemos cómo crear una vista, cómo mostrar información en esa vista, pero ahora queremos añadir en la vista información que recuperamos de la base de datos a través de un controlador.
Partimos de un método de nuestro ProductController:
// code public function show($product) { $product = Product::findOrFail($product); return view("products.show"); }
Para enviar información a la vista usamos with y definimos qué nos llevaremos a la vista.
// code public function show($product) { $product = Product::findOrFail($product); return view("products.show")->with([ "product" => $product, ]); }
A la vista estaremos enviando la variable product con el valor $product.
Si vamos a la vista (resources/views/products/show.blade.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Product</title> </head> <body> <h1>{{ $product->title }} ({{ $product->id }})</h1> <p>{{ $product->description }}</p> <p>{{ $product->price }}</p> <p>{{ $product->stock }}</p> <p>{{ $product->status }}</p> </body> </html>
Usando Blade, el motor de plantillas que incluye Laravel, interpretará las variables. Las encerramos entre llaves dobles ({{ }}).
