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:25] tempwininformatica:programacion:php:cursos:laravel_8:20250529 [2023/05/29 14:59] (actual) tempwin
Línea 62: Línea 62:
 Laravel solo ejecutará la nueva migración (porque no está en la tabla **migrations**) Laravel solo ejecutará la nueva migración (porque no está en la tabla **migrations**)
  
-en ''database/factories//ProductFactory.php''+
  
 En ''database/seeders/DatabaseSeeder.php'' vamos a generar datos: En ''database/seeders/DatabaseSeeder.php'' vamos a generar datos:
Línea 77: Línea 77:
  
 Tendremos el registro nuevo en tabla **products**. Tendremos el registro nuevo en tabla **products**.
 +
 +En ''database/factories/ProductFactory.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>
 +
 +  * [[https://fakerphp.github.io/|Biblioteca Laravel Faker]]
 +
 +Modificaríamos ahora ''DatabaseSeeder.php'':
 +
 +<code php>
 +// ...
 +    Product::factory(100)->create();
 +</code>
 +
 +Como no indicamos nada por argumento a ''create'', 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:
 +
 +''resources/views/products/index.blade.php'':
 +
 +<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 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.1685359527.txt.gz · Última modificación: por tempwin