¡Esta es una revisión vieja del documento!
Curso Laravel 8.0 clase 29/05/2023
Notas sobre la clase del 29/05/2023 del curso Curso de Laravel 8.0
Resumen semana pasada:
- Tests unitarios
- Estructura de Laravel
- MVC
LAravel se lleva muy bien con Vue (y quizás con React). Laravel no quiere jQuery
Recordamos la creación del modelo:
php artisan make:model Product -a
Creará también los métodos para hacer un CRUD.
En base de datos, aunque nuestro modelo sea singular, Laravel crea la base de datos en plural.
database/migrations/….create_products_table.php
Para crear realmente la estructura en base de datos, lanzamos todas las migraciones:
php artisan migrate
Echando vistazo a la base de datos, vemos las siguientes tablas:
- failed_jobs: colas de tareas. Tareas que se ejecutan de manera asíncrona. Envío de e-mails, por ejemplo. Aquí se guardarán las tareas que no han terminado correctamente.
- migrations: ficheros de migraciones. Los que aparezcan, Laravel no los ejecutará más.
- password_resets
- personal_access_tokens
- products
- users
Si queremos forzar a lanzar todas las migraciones:
php artisan migra:fresh
No usar ese comando en producción porque se borrará la base de datos.
Nuevo fichero de migración:
php artisan make:migration adds_description_to_products
Añadimos un campo nuevo a la tabla “products”
php artisan migrate
Laravel solo ejecutará la nueva migración (porque no está en la tabla migrations)
En database/seeders/DatabaseSeeder.php vamos a generar datos:
run() { Product::factory(['name' => 'tesla 5', 'description' => 'coche que mola'])->create(); }
php artisan db:seed
Tendremos el registro nuevo en tabla products.
En database/factoriesProductFactory.php
Para tener variedad en los datos que se vayan a meter:
<code php>
public function definition() {
return [
'name' ⇒ $this→faker→name(),
'description' ⇒ $this→faker-text()
];
}
</code>
* Biblioteca Laravel Faker
Modificaríamos ahora DatabaseSeeder.php:
<code php>
…
Product::factory(100)→create();
</code>
Como no indicamos nada por argumento a resources/views/products/index.blade.phpcreate, tomará lo de la biblioteca Faker.
Limpieza:
<code>
php artisan migrate:fresh – seed
</code>
Borra la base de datos, la vuelve a crear y luego la rellena de datos.
Vamos con las rutas. Para poder verlas:
<code>
php artisan route:list
</code>
app/Http/Controllers/ProeductController.php
<code php>
public function index() {
return view (“product.index”); el punto sustituye la barra (/) para evitar incompatibilidades Windows-Linux
}
</code>
Creamos la vista:
:
<code>
<h1>Listado de productos</h1>
<ul>
<li><p>Nombre: tesla5</p>
<p>Descripción: coche que mola</p></li>
</ul>
</code>
Ahora podemos ir a http://localhost/product
Para pasarle lo que hay en base de datos:
<code php>
public function index() {
Cogemos todos los productos
$products = Product::all();
return view (“product.index”, [“productsList” ⇒ $products]);
}
</code>
En la vista:
<code html>
<h1>Listado de productos</h1>
<ul>
@foreach($productsList as $product)
<li><p>Nombre: product-_name</p>
<p>Descripción: product-_name</p></li>
@endforeach
</ul>
</code>
Eloquent es el ORM que utiliza Laravel. Object Relational Mapping. AL profe le gusta más el que usa Symfony: Doctrine.
El modelo Producto y el modelo de datos no tendría que ser lo mismo. Laravel lo junta. Veremos más adelante cómo separarlo.
<code php>
public function index() {
Cogemos todos los productos
$products = Product::all();
Para visualizar el contenido y no continuar luego:
dd($products);
return view (“product.index”, [“productsList” ⇒ $products]);
}
</code>
Vamos con el create, para la creación (no confundir con store que sería el que almacena):
<code php>
public function create() {
Cogemos todos los productos
$products = Product::all();
Para visualizar el contenido y no continuar luego:
dd($products);
return view (“product.create”, [“productsList” ⇒ $products]);
}
</code>
Se crea la vista en resources/views/products/create.blade.php:
<code html>
<form action=“/product” method=“post”>
<input typè=“text” name=“name”>
<input typè=“text” name=“description”>
<input typè=“submit” value=“Enviar”>
</form>
</code>
En el atributo “name” hay que poner el nombre del campo.
Ese formulario irá a
<code php>
public function store(StoreProductRequest $request) {
dd($request);
}
</code>
Al enviar formulario nos saldrá el error 419 page expired se debe al CSRF (Cross Site Request Forgery). Lo arreglamos con:
<code html>
<form action=“/product” method=“post”>
@csrf
<input typè=“text” name=“name”>
<input typè=“text” name=“description”>
<input typè=“submit” value=“Enviar”>
</form>
</code>
Ahora el error cambiará a 403 - non authorized. Miramos StoreProductRequest.php y en el método authorize() cambiamos el boolean que devuelve (estaba en false, entonces ponemos true).
Modificamos el store:
<code php>
public function store(StoreProductRequest $request) {
Product::create($request→all());
}
</code>
Si ahora volvemos a enviar el formulario, tendremos otro error relacionado con el token. Laravel por seguridad no permite meter de todo.
Solucionamos en el modelo Product.php:
<code>
use HasFactory;
protected $fillable = ['name', “description”];
</code>
Seguimos modificando la vista:
<code html>
<form action=“/product” method=“post”>
@csrf
<input typè=“text” name=“name”>
<input typè=“text” name=“description”>
<input type=“text” name=“id”>
<input typè=“submit” value=“Enviar”>
</form>
</code>
Ignorará el campo ID porque no está en el $fillable.
Tareas:
Crear modelo:
que esté en base de datos
formulario creación
Pero con TDD
