2 pts
En esta segunda parte de la práctica, vamos a incorporar los DAO a nuestro proyecto. El funcionamiento es muy similar a lo hecho hasta ahora. Creamos la interfaz IMoviesDAO (la cual usará el servicio IMoviesService) con los métodos típicos de un CRUD:
namespace App\DAO; use App\DTO\MovieDTO; interface IMoviesDAO { public function create(MovieDTO $movie): bool; public function read(): array; public function findById(int $id): MovieDTO; public function update(int $id, MovieDTO $movie): bool; public function delete(int $id): bool; }
Por ahora, solo vamos a implementar los métodos read() y findById().
El siguiente paso es crear la clase MoviesStaticDAO que implementará la interfaz recién creada. En realidad, el código de esta clase ya está casi todo hecho en el servicio que creamos anteriormente. Lo único que tenemos que hacer es moverlo aquí y hacer los cambios correspondientes en el servicio para usar esta nueva clase (igual que hicimos en la última parte de la práctica anterior):
namespace App\DAO\impl; use App\DTO\MovieDTO; use App\DAO\IMoviesDAO; class MoviesStaticDAO implements IMoviesDAO { private $movies = [ array( "id" => 1, "titulo" => "El padrino", "anyo" => 1972, "duracion" => 175 ) , array( "id" => 2, "titulo" => "El padrino 2", "anyo" => 1974, "duracion" => 200 ) , array( "id" => 3, "titulo" => "Senderos de gloria", "anyo" => 1957, "duracion" => 86 ) , array( "id" => 4, "titulo" => "Primera plana", "anyo" => 1974, "duracion" => 105 ) ]; /** * * @param MovieDTO $movie * * @return bool */ function create(MovieDTO $movie): bool { return false; } /** * * @return array */ function read(): array { $result = array(); foreach ($this->movies as $movie) { array_push($result, new MovieDTO( $movie['id'], $movie['titulo'], $movie['anyo'], $movie['duracion'] ) ); } return $result; } /** * * @param int $id * * @return MovieDTO */ function findById(int $id): MovieDTO { @TODO } /** * * @param int $id * @param MovieDTO $movie * * @return bool */ function update(int $id, MovieDTO $movie): bool { return false; } /** * * @param int $id * * @return bool */ function delete(int $id): bool { return false; } }
Comprueba que todo funciona como toca al acceder a las dos rutas (miweb.com/api/peliculas y miweb.com/api/peliculas/#).
Ampliación 1 (1 pt)
Crea otra implementación de IMovieDAO que lea los datos de los archivos JSON que tendremos almacenados en la carpeta data.
Archivos JSON: peliculas.zip
Haz que el servicio utilice ahora la implementación recién creada para buscar los datos.
Ampliación 2 (1 pt)
Crea una nueva carpeta que se llame factories dentro de src. En esa carpeta, crea un archivo con la clase MoviesFactory. Esa clase tendrá dos métodos: getService() y getDAO(), encargadas cada una de devolver el servicio o el DAO que queramos utilizar.
Utiliza la clase recién creada para no tener que indicar en el constructor de las clase (controlador y servicio) el tipo de servicio o DAO que vamos a utilizar. Ahora, cada vez que queramos utilizar un servicio o un DAO, llamaremos a MoviesFactory para que nos devuelva el componente que toca.
Ampliación 3 (1 pt)
Crea una nueva carpeta response en src con un archivo con la clase HTTPResponse. Esa clase solo tendrá un método, json() que recibirá un código de estado y los datos que tendrá que devolver en formato JSON.
En el método, tendremos que comprobar el tipo de datos que nos pase para poder transformarlos correctamente con la función jsonSerialize() que implementamos en los DTOs. Si ocurre una excepción, le pasaremos un String al método, con lo que deberá devolver el mensaje de la excepción en formato JSON.