SIU-Guarani/Version3.11.0/personalizaciones/rest
Personalizar servicios REST
Crear un nuevo servicio REST
Si lo que se desea es crear un nuevo servicio REST se debe hacer lo siguiente:
Supongamos que el nuevo servicio manipule aulas, por lo tanto nuestro nuevo recurso pasara a llamarse aulas, para crearlo seguiremos los siguientes pasos:
- Crear el archivo <path proyecto Guaraní>/personalizacion/php/rest/aulas_uni/recurso_aulas_uni.php, donde uni sera en nombre de la universidad en cuestión (esto evita futuras colisiones de nombre si el SIU decide mas adelante agregar el recurso aulas).
- Dentro de dicho archivo crear la clase recurso_aulas_uni la cual debe implementar la interface modelable:
- <?php
//personalizacion/php/rest/aulas_uni/recurso_aulas_uni.php
use SIUToba\rest\rest;
use SIUToba\rest\lib\rest_validador;
class recurso_aulas_uni implements SIUToba\rest\lib\modelable{
............
}
- Luego procederemos a agregar la capa de datos que se encargara de las operaciones de tipo ABM/CRUD de los servicios en cuestión, en este caso agregaremos la clase rest_aulas_uni en <path proyecto Guaraní>/personalizacion/php/nucleo/aulas/rest_aulas_uni.php:
- <?php
//personalizacion/php/nucleo/aulas/rest_aulas_uni.php
class rest_aulas_uni{
............
}
- Seguido vincularemos la clase rest_aulas_uni a nuestro nuevo recurso recurso_aulas_uni:
- <?php
//personalizacion/php/rest/aulas_uni/recurso_aulas_uni.php
use SIUToba\rest\rest;
use SIUToba\rest\lib\rest_validador;
class recurso_aulas_uni implements SIUToba\rest\lib\modelable{
/**
* @var rest_aulas_uni
*/
protected $modelo;
function __construct()
{
$this->modelo = guarani::rest('rest_aulas_uni');
}
}
- Luego a modo de ejemplo crearemos la estructura que tendrá nuestro recurso el cual llamaremos Aula_uni y tendrá los atributos nombre, fecha_creacion, estado y edificio (modelo Edificio_uni):
- <?php
//personalizacion/php/rest/aulas_uni/recurso_aulas_uni.php
use SIUToba\rest\rest;
use SIUToba\rest\lib\rest_validador;
class recurso_aulas_uni implements SIUToba\rest\lib\modelable{
............
public static function _get_modelos(){
$edificio_uni = array(
'nombre' => array(
'type' => 'string'
)
);
$aula_uni = array(
'nombre' => array(
'type' => 'string'
),
'fecha_creacion' => array(
'type' => 'date',
'_validar' => array(rest_validador::TIPO_DATE)
),
'estado' => array(
'type' => 'string',
'enum' => array("A", "B"),
'_validar' => array(rest_validador::TIPO_ENUM => array("A", "B"))
),
'edificio' => array('$ref' => 'Edificio_uni')
);
return array(
'Aula_uni' => $aula_uni,
'Edificio_uni' => $edificio_uni
);
}
}
- Finalmente a modo de ejemplo crearemos tres servicios, uno para la creación de un aula (POST /aulas-uni), otro para obtener un listado de aulas (GET /aulas-uni) y un tercero para obtener un aula en particular dado el ID de aula (GET /aulas-uni/{id_aula}):
- <?php
//personalizacion/php/rest/aulas_uni/recurso_aulas_uni.php
use SIUToba\rest\rest;
use SIUToba\rest\lib\rest_validador;
class recurso_aulas_uni implements SIUToba\rest\lib\modelable{
............
/**
* POST /aulas-uni
*
* Crea una nueva aula.
*
* @param_body $aula Aula_uni [required] Campos de un aula.
*
* @summary Crea una nueva aula
*
* @responses 201 Exito - El aula se creo exitosamente
* @responses 400 Errores de validación
* @responses 500 Falló la creación del aula
**/
function post_list()
{
$datos = rest::request()->get_body_json();
$this->modelo->post($datos);
}
/**
* GET /aulas-uni
*
* @param_query $nombre string Filtro por nombre
* @param_query $estado string Filtro por estado
* @param_query $order string (defecto: +nombre,+estado) +/-[nombre,estado] Ordena por nombre o estado
* @param_query $limit integer (defecto: 20) Limitar a esta cantidad de registros
* @param_query $page integer Página
*
* @notes
* Devuelve una lista de aulas.<br>
* Los Filtros se definen como <b>condicion;valor</b>, donde <b>condicion</b> puede ser: <br/>
* entre, es_mayor_que, desde, es_mayor_igual_que, es_menor_que, es_menor_igual_que, hasta, es_igual_a, es_distinto_de, contiene, no_contiene, comienza_con, termina_con
*
* @summary Aulas
* @responses 200 array {"$ref":"Aula_uni"}
*/
function get_list()
{
$datos = $this->modelo->get_list();
rest::response()->get_list($datos);
}
/**
* GET /aulas-uni/id_aula
*
* @notes
* Retorna los datos del aula.<br>
*
* @summary Datos del aula {id_aula}
* @responses 200 {"$ref":"Aula_uni"}
* @responses 404 El aula {id_aula} no existe
*/
function get($id_aula)
{
$datos = $this->modelo->get($id_aula);
rest::response()->get($datos);
}
}
Al ingresar a <URL proyecto Guaraní>/rest/ podremos observar el recurso aulas-uni con sus tres nuevos servicios:
IMPORTANTE: Luego de hacer los pasos listados anteriormente se deberá correr el comando autoload para cargar las clases previamente agregadas:
Personalizar un servicio REST existente
Si lo que se desea es personalizar un servicio REST existente hacer lo siguiente:
Supongamos que queremos personalizar el recurso docentes, para personalizarlo seguiremos los siguientes pasos:
- Crear el archivo <path proyecto Guaraní>/personalizacion/php/rest/docentes_uni/recurso_docentes_uni.php, donde uni sera en nombre de la universidad en cuestión (esto es para evitar sobrescribir los servicios provistos por el SIU).
- Dentro de dicho archivo crear la clase recurso_docentes_uni la cual debe heredar de la clase provista por el SIU (en este caso recurso_docentes):
- <?php
//personalizacion/php/rest/docentes_uni/recurso_docentes_uni.php
use SIUToba\rest\rest;
use SIUToba\rest\lib\rest_validador;
class recurso_docentes_uni extends recurso_docentes {
............
}
A continuación se presentan distintos ejemplos de personalización:
Personalizar los modelos del recurso
Para personalizar los modelos del recurso procedemos a sobrescribir el método _get_modelos para agregar nuevos modelos personalizados, en este caso crearemos el modelo Docente_uni el cual lo copiamos de Docente y le agregamos la propiedad dni:
//personalizacion/php/rest/docentes_uni/recurso_docentes_uni.php
use SIUToba\rest\rest;
use SIUToba\rest\lib\rest_validador;
class recurso_docentes_uni extends recurso_docentes {
............
public static function _get_modelos()
{
//Obtengo los modelos de la clase padre (recurso_docentes)
$modelos = parent::_get_modelos();
//Creo el modelo 'Docente_uni' copiandolo de 'Docente'.
$modelos['Docente_uni'] = $modelos['Docente'];
//Le agrego la propiedad 'dni'.
$modelos['Docente_uni']['dni'] = array('type' => 'string');
return $modelos;
}
}