Entender Laravel

1

隆Actualizamos este curso!

2

驴Qu茅 es Laravel?

3

Herramientas necesarias para trabajar con PHP y Laravel

4

Entendiendo el ciclo de vida de las solicitudes web

5

Qu茅 es un CRUD y c贸mo implementarlo

6

L贸gica de controladores y vistas con datos de prueba

7

Creando un formulario

Comprender los Fundamentos de Laravel

8

Sistema de rutas y controladores

9

Uso de Middlewares

10

Validaci贸n de datos (rutas, vistas, formularios y controladores)

11

Blade: sistema de plantillas avanzado

12

Trabajando con el componente Laravel/UI

Aprender sobre Eloquent ORM

13

Eloquent: trabajando con este ORM

14

Relaciones de tablas

15

Colecciones y serializaci贸n de datos

16

Formato de valores en tablas y presentaci贸n de datos

Crear PlatziPress

17

Proyecto Blog: presentaci贸n y configuraci贸n inicial

18

Creaci贸n de tablas, entidades y datos de prueba

19

Plantillas de trabajo y entendiendo el login

20

Dise帽o visual con Bootstrap

21

Vista index y botones de acci贸n

22

Implementaci贸n del formulario de creaci贸n

23

Implementaci贸n del guardado

24

Creando la funci贸n de editar un post

25

Actualizando nuestros posts

26

Integrando contenido audiovisual

Construir Proyecto Final: API con TDD (Intermedio)

27

Introducci贸n al testing

28

Metodolog铆a TDD y testing HTTP

29

Proyecto API con TDD: presentaci贸n y configuraci贸n inicial

30

Store con TDD

31

Refactorizaci贸n y validaci贸n en Store

32

Show con TDD

33

Update y validaci贸n con TDD

34

Delete con TDD

35

Index con TDD

36

Protecci贸n de una API con Login

37

Cierre del curso

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Adquiere por un a帽o todos los cursos, escuelas y certificados por un precio especial.

Antes: $249

Currency
$219/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

0D
16H
21M
19S
Curso de Introducci贸n a Laravel 6

Curso de Introducci贸n a Laravel 6

Profesor Italo Morales F

Profesor Italo Morales F

Store con TDD

30/37
Recursos

Aportes 44

Preguntas 10

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Si usan laravel en su versi贸n 7.3 en adelante pueden utilizar el comando php artisan test en lugar de vendor/bin/phpunit . El comando artisan test les proveera mas informaci贸n y una interfaz mas amigable.

could not find driver

Si les aparece un error de este tipo :

failed Illuminate\Database\QueryException 
could not find driver (SQL: PRAGMA foreign_keys = ON;)

La soluci贸n que me funcion贸 fue ejecutar el comando :

sudo apt-get install php-sqlite3      

馃榿馃榿馃榿馃榿

Si les llega a mandar error en las rutas al ejecutar el listado de las mismas:

Target class [Api\PostController] does not exist.

En Laravel 8 se tiene que utilizar el Fully Qualified Class Name, o sea, toda la ruta del controlador:

Route::apiResource('posts', 'App\Http\Controllers\Api\PostController');

Si tiene dudas de los c贸digos de status les dejo una p谩gina que me ayudo mucho

Http Status

Si terminas la clase y muestra que tienes problemas con los archivos relacionados con Database al hacer el test, pues as铆 lo solucion茅 yo:

  • Abr铆 el archivo php.ini haciendo click en el menu de Laragon -> PHP -> php.ini. Si usas alguna otra herramienta buscalo en tu carpeta de xamp o apache2.
  • Busque la palabra sqlite para ir a la linea donde estaba declarado.
  • En mi caso estaba comentado, asi que lo descoment茅 y guard茅.
  • Reinici茅 el servidor de Laragon.
  • Funcion贸 al hacer la prueba.

lluminate\Database\QueryException: could not find driver (SQL: PRAGMA foreign_keys = ON;)

Este problema es ocasionado por el driver de sqlite que desde PHP5.0 ya viene integrado pero el modulo esta des habilitado entonces solo tienes que modificar el archivo php.ini de la siguiente forma:

//'encuentra la siguiente linea' 
;extension=pdo_sqlite

//'quita el ; que tiene al inicio, guarda el archivo y reinicia tu servidor local'
extension=pdo_sqlite

Una vez realizado lo anterior, los test se ejecutan sin problema.

Espero que esto les ayude 馃槂

PARA LARAVEL 8

Si despu茅s de correr las pruebas te pone 鈥淯nknow database laravel鈥 es porque est谩 usando por defecto la base de datos real, lo cual no es correcto, debemos mantener nuestra base de datos real separado de la base de datos de testing, ya que la base de datos de testing realizar谩 pruebas y refrescar谩 la base de datos, etc.

El error se debe a que en Laravel 8, las lineas del driver de la base de datos vienen comentadas en el archivo phpunit.xml, lo 煤nico que tienen que hacer es descomentarlas para que puedan correr su prueba.

Si despu茅s de da error por el driver, abajo hay algunas aportaciones explic谩ndote c贸mo resolverlo, si est谩s trabajando con Ubuntu y tienes apache instalado por tu parte, debes instalar la extensi贸n para sqlite: sudo apt-get install php7.4-sqlite

$this->withoutExceptionHandling(); no muestra un detalle mas amplio del error

Store con TDD


Los m茅todos dentro de la clases de pruebas siempre tienen que comenzar con test y underscore, as铆:

public function test_store() {}

En el siguiente caso estamos accediendo a la ruta 鈥/api/posts鈥 y enviamos el dato Array que le sigue. Despu茅s, cuando eso suceda el sistema tiene que retornar en un sistema JSON dentro de un Array los datos en la 煤ltima sentencia y comprobar que tenga el Array que enviamos con anterioridad.

class PostControllerTest extends TestCase {
    public function test_store() {
        $response = $this->json('POST', '/api/posts', [
            'title' => 'El post de prueba'
        ]);

        $response->asserJsonStructure(['id', 'title', 'created_at','updated_at'])
            ->assertJson(['title' => 'El post de prueba'])
            ->assertStatus(201); //Status OK, se a creado un recurso

        // Para saber si existe este dato en la Databse
        $this->assertDatabaseHas('posts', ['title' => 'El post de prueba']);
    }
}

Si les sale el siguiente error al ejecutar PHPUnit:

could not find driver (SQL: PRAGMA foreign_keys = ON);

Tienes que instalar la extensi贸n de sqlite, este es el comando para ubuntu:

sudo apt-get install php-sqlite3

Podemos realizar tambien lo siguiente ni no queremos usar la iniciaci贸n test_
Ejemplo:

/**@test*/

public function can_create_user() {/*Aqui va mi c贸digo*/}

Para los que trabajan desde Windows, en la versi贸n de php 7.2.5
les saldr谩 el siguiente error:

There was 1 error:

1) Tests\Feature\Http\Controllers\Api\PostControllerTest::test_store
Illuminate\Database\QueryException: 
could not find driver (SQL: PRAGMA foreign_keys = ON;)

Este error se soluciona de la siguiente manera:
Navega hasta la ruta donde tienes php instalado

C/php/php.ini

Una vez encuentres el archivo 鈥淧HP.INI鈥 con tu editor favorito vas a modificar las siguientes l铆neas de c贸digo:

909	|		;extension=pdo_sqlite 

Eliminar el punto y coma ( 鈥;鈥 )

909	|		extension=pdo_sqlite 

Debes hacer lo mismo en la siguiente linea de codigo:

919	|		;extension=sqlite3 

Eliminar el punto y coma ( 鈥;鈥 )

919	|		extension=sqlite3 

Y listo ya te debe funcionar bien el comando php:

php vendor/phpunit/phpunit/phpunit 

En Laravel 8.x me funciono as铆 en las rutas:

use App\Http\Controllers\Api\PostController;

Route::apiResource('/api/posts', PostController::class);```

Pase d铆as intentando solucionar esto

could not find driver (SQL: PRAGMA foreign_keys = ON);

La soluci贸n era simple y la vi por todos lados, pero por una confusi贸n nunca lo intente.
.
Yo uso laragon y lei que deb铆a activar las extensiones de sqlite en laragon, lo hice, pero segu铆a sin funcionar. La cuesti贸n es que los test no corren en el servidor web, corren en local y estaba ejecutando los test en la consola de ubuntu, donde no tenia las extensiones, esa fue mi confusi贸n. Laragon activa las extensiones en windows mas no en ubuntu.
.
Conclusi贸n:

  • Si usas una terminal de windows solo activa las extensiones y aseg煤rate de que estas ejecutando la versi贸n de php de laragon.
  • Si usas ubuntu ejecutar el comando sudo apt-get install php-sqlite3 y con eso deberia bastar.
    .
    Espero que no tengan que pasar por lo que yo pas茅 para aprender esto 馃槀馃挌

Por si a alguien le sirve esto para el futuro, alguien que est茅 trabajando con Laravel 8, como yo:

En el archivo api.php, me funcion贸 de la siguiente manera:

Route::apiResource('posts', 'App\Http\Controllers\Api\PostController');

Y utilic茅 el m茅todo postJson en test_store()

    public function test_store()
    {
        $this->withoutExceptionHandling();
        $response = $this->postJson('/api/posts', [
            'title' => 'El post de prueba'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
            ->assertJson(['title' => 'El post de prueba'])
            ->assertStatus(201);

        $this->assertDatabaseHas('posts', ['title' => 'El post de prueba']);
    }

Los Test son gu铆as para hacer un codigo correcto

You tuve el error de

Failed asserting that an array has the key 'id'. 

Y usaba la fucion para ver los errores pero salia lo mismo y lo que estaba mal era la funcion para
crear el registro el mio era

$post = Post::created($request->all());

y era para hacer

$post = Post::create($request->all());

pero lo que no llego a comprender porque no me salia el error de la funcion al go asi como que no existe estuve revisando buen tiempo hasta que di con el error.

Alguno hizo instalacion en WSL2 , y corre sus archivos dentro del sistema de archivos de linux? a mi no me deja abrir la base de datos SQLITE

鈥 Tests\Feature\Http\Controllers\Api\PostControllerTest > store
Illuminate\Database\QueryException

SQLSTATE[HY000] [14] unable to open database file (SQL: PRAGMA foreign_keys = ON;)

at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678
674鈻 // If an exception occurs when attempting to run a query, we鈥檒l format the error
675鈻 // message to include the bindings with SQL, which will make this exception a
676鈻 // lot more helpful to the developer instead of just the database鈥檚 errors.
677鈻 catch (Exception $e) {
鉃 678鈻 throw new QueryException(
679鈻 $query, $this->prepareBindings($bindings), $e
680鈻 );
681鈻 }
682鈻

No entiendo cual es el error :c

TDD De method store
5

A) Creamos el test para el method store , es un test bien completo muy profesional //current state:red

B)Configuramos el archivo de migrations de posts para trabajar con datos

C)Creamos el controller

D) Creamos la ruta
//current state:Green

A)
"tests/Feature/Http/Controllers/Api/PostController

class PostControllerTest extends TestCase
{
    use RefreshDatabase; //tener permiso para crear el post de prueba

    public function test_store(){
       // es como un console.log $this->withoutExceptionHandling();

           //Proba esa peticion//method//enviado a esta ruta
        $response = $this->json('POST', '/api/posts',[
            "title" => "El post de test"// con [este dato]
        ]);

        
            //retorna un json         con estos datos
        $response->assertJsonStructure(["id", "title", "created_at","updated_at"])
            ->assertJson(["title" => "El post de test" ])//el titulo es eese?
            ->assertStatus(201); //PETICION OK?

                //en la DB//en esta tabla// existe este dato?
        $this->assertDatabaseHas("posts",["title" => "El post de test"]);

    }
}


B)Configuracion de tablas!
"database/migrations/createtableposts
//creamos el campo title

Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements("id");

            $table->string("title");

            $table->timestamps();
        });


"Post.php
// este model acepta estos campos 
class Post extends Model
{
        protected $fillable = ['title'];

}


C) El controller!
"app/Http/Controllers/Api/PostController.php

    public function store(Request $request)
    {



        $post = Post::create($request->all()); //creamos lo que vino 
        return response()->json($post,201); //devolvemos y con 201
    }



D) LAS RUTAS!
"routes/api.php

Route::apiResource('/posts','Api\PostController');
		//ruta		//controller


perfecto funciono, hice las pruebas reales, migrando la base de datos, y simulando por medio de postman, el envi贸 de una informaci贸n por medio de la api creado, y todo es correcto con lo que dice el test de prueba con TDD.

Creo que el profesor no muestra cuando ejecuta el comando php artisan migrate, pero hay que ejecutarlo para que las tablas se creen en el archivo de sqlite, de lo contrario les aparecer谩 un error como el siguiente al usar $this->withoutExceptionHandling() indicando que no encuentra la tabla:

SQLSTATE[HY000]: General error: 1 no such table: posts (SQL: insert into "posts" ("title", "updated_at", "created_at") values (Post de prueba, 2020-04-11 21:12:55, 2020-04-11 21:12:55))

esto es muy interesante

Recordar habilitar la extension para sqlite en el php.ini

extension=pdo_sqlite

Lo anterior para evitar el error que pueda aparecer en el ejercicio:

Post Controller (Tests\Feature\Http\Controllers\Api\PostController)
 鉁 Store
   鈹
   鈹 Illuminate\Database\QueryException: could not find driver (SQL: PRAGMA foreign_keys = ON;)

Pilas con tener la DB creada y con la contrase帽a de la conexcion

Al usar Laravel 8 con este proyecto me doy cuenta de que al intentar importar la clase del controlador en el archivo de rutas, Laravel no encuentra el controlador:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::apiResource('posts', 'Api\PostController');

Resulta que si es posible hacerlo, pero es necesario configurar el routeServiceProvider, Sin embargo, a opini贸n personal prefiero importar la clase directamente, tal como se hace en otros lenguajes.

En ese orden de ideas la soluci贸n ser铆a importar el controlador as铆:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

// Import Controllers
Use App\Http\Controllers\Api\PostController;

Route::apiResource('posts', PostController::class);

Espero les sirva 馃槂

Comparto los c贸digos de estado de una respuesta HTTP.
https://developer.mozilla.org/es/docs/Web/HTTP/Status

Tambi茅n comparto el listado de afirmaciones (asserts) desde la p谩gina oficial de Laravel
https://laravel.com/docs/9.x/http-tests#available-assertions

脥talo explica las cosas muy bien si lo que se quiere es reforzar y ampliar los conocimientos, sin embargo para personas que no tengan conocimientos previos en lo que esta explicando es sumamente complicado entender que esta haciendo y mas importante, el porque, me paso con el curso de php con composer (el cual se supon铆a que era de introducci贸n a php) y me esta pasando igual con este curso, en la parte de TDD entiendo el que esta haciendo, pero muchas veces no entiendo el porque, que es lo mas importante, de que me sirve saber que hace si no se porque o cuando se aplica, hay que ver otros cursos para entender lo que esta pasando

Ayuda por favor tengo este error en el minuto 12:

Lo consegui!, Hice mi primer test en Laravel!

class PostTest extends TestCase
{
    use RefreshDatabase;

    public function test_store()
    {
        //$this->withoutExceptionHandling(); //PARA TESTING DETALLADO
        $response = $this->json('POST','/api/posts',[
            'title' => 'El Post de Prueba'
        ]);

        $response->assertJsonStructure(['id','title','created_at','updated_at'])
            ->assertJson(['title' => 'El Post de Prueba'])
            ->assertStatus(201); //OK Y CREADO UN RECURSO : CODIGO 201
        

        $this->assertDatabaseHas('posts',['title' => 'El Post de Prueba']);
    }


}

Alguien mas tuvo este error a hacer el testing?

  1. Tests\Feature\Http\Controllers\Api\PostControllerTest::test_store Illuminate\Database\QueryException: SQLSTATE[HY000] [1698] Access denied for user 鈥榬oot鈥橜鈥榣ocalhost鈥 (SQL: SHOW FULL TABLES WHERE table_type = 鈥楤ASE TABLE鈥)

Ya descoment茅 esta linea en el php.ini:

;extension=pdo_sqlite

porque crei que era ese el problema. Guarde y reinicie el servidor de apache pero no paso nada.
Sigue sin funcionar 馃槙

En laravel 8 la ruta de la Api se declararia asi:

Route::apiResource('posts', \App\Http\Controllers\Api\PostController::class);

Cuando ejecuta el comando php artisan route:list y aparece el listado de rutas.

Que diferencia hay entre las rutas que usan el Middleware web vs el Middleware api.

En el minuto 7:14 podriamos decir que terminamos de creat el test?

A lo que entiendo es que como dijo en una clase el profesor si no estoy mal, que laravel,
nos deja crear rutas tanto en api o en web鈥 pero obviamente esta separado para diferentes prop贸sitos
as铆 no oblig谩ndonos a tener buenas practicas pero si dando recursos para hacerlas

Buen video a pesar de un par de errores que me llevaron un rato solventar. Por aqui os dejo mi repositiorio por si a alguno le sirve de referencia.Intento subir los commits bien detallados.

Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: requirements are turned into very specific test cases, then the code is improved so that the tests pass.

Desarrollo guiado por pruebas de software, o TDD (Test-driven development) es una pr谩ctica de ingenier铆a de software que involucra otras dos pr谩cticas: Escribir las pruebas primero y Refactorizaci贸n.

Para mejorar el output de phpunit en la terminal se puede usar el comando vendor/bin/phpunit --testdox o php artisan test

Y si se quiere guardar el output en un archivo txt o html:
vendor/bin/phpunit --testdox-text foo.txt o vendor/bin/phpunit --testdox-html foo.html

A mi nome funcion llamar al metodo manejador de errores que utilizaron en la clase, simplemente no me salio el erorr descrito cuando se corre el vendor.

 public function store(Request $request)
    {
        $this->withoutExceptionHandling();

        $post = Post::create($request->all());

        return response()->json($post, 201);
    }```

Chicos consulta, 驴como hago un test a un archivo especifico?

Para los que est茅n usando Laravel 8.x y les da error que no encuentra la clase del controlador les dejo el link de los pasos a seguir, solo tienen que dirigirse a la secci贸n de Routing UPGRADE LARAVEL 8.x. Espero les sea de ayuda.

test_store
Illuminate\Validation\ValidationException: The given data was invalid.

Alguien ha tenido este error?