Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:cursos:laravel_8:20250529

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:programacion:php:cursos:laravel_8:20250529 [2023/05/29 13:35] tempwininformatica:programacion:php:cursos:laravel_8:20250529 [2023/05/29 14:59] (actual) tempwin
Línea 78: Línea 78:
 Tendremos el registro nuevo en tabla **products**. Tendremos el registro nuevo en tabla **products**.
  
-En ''database/factories//ProductFactory.php''+En ''database/factories/ProductFactory.php''
  
 Para tener variedad en los datos que se vayan a meter: Para tener variedad en los datos que se vayan a meter:
Línea 91: Línea 91:
 </code> </code>
  
-  * Biblioteca Laravel Faker+  * [[https://fakerphp.github.io/|Biblioteca Laravel Faker]]
  
 Modificaríamos ahora ''DatabaseSeeder.php'': Modificaríamos ahora ''DatabaseSeeder.php'':
Línea 135: Línea 135:
 </ul> </ul>
 </code> </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 php>
 +    use HasFactory;
 +    
 +    protected $fillable = ['name', "description"];
 +</code>
 +
 +Seguimos modificando la vista:
 +
 +<code html>
 +<form action="/product" method="post">
 +    @csrf
 +    <input type="text" name="name">
 +    <input type="text" name="description">    
 +    <input type="text" name="id">
 +    <input type="submit" value="Enviar">
 +</form>
 +</code>
 +
 +Ignorará el campo ID porque no está en el ''$fillable''.
 +
 +Nos mandan hacer una tarea usando TDD para
 +
 +  * Crear modelo:
 +  * Que el modelo esté en base de datos
 +  * Formulario creación
 +
 +Uno de los primeros indicadores que dice que un test no es unitario es que conecte con base de datos. Sería un test de integración.
 +
 +**No testeamos código que no sea nuestro**.
 +
 +Para saber qué testeamos tenemos que pensar primero en qué necesitamos. El test tiene que llevar a un diseño concreto.
 +
 +No probamos datos, solo comportamientos. Por ejemplo, comprobar si existen ciertos campos.
 +
 +Tests unitarios:
 +
 +  * Un test unitario no habla con servicios externos (la base de datos es un servicio externo, el reloj del sistema es también externo)
 +
informatica/programacion/php/cursos/laravel_8/20250529.1685360105.txt.gz · Última modificación: por tempwin