====== Práctica 2b ======
**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/#//).
===== Ampliaciones =====
**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: {{ :clase:daw:dws:1eval:practicas: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.