Clase Request

La clase Request contiene informacion acerca de la peticion que realizo el usuario por la url del sitio. Si recordamos la url del sitio esta compuesta de la siguiente forma: www.urlsitio.com/modulo/adaptador/accion/param1/valor1/......./paramn/valorn entonces la clase Request nos proporcionara informacion sobre el modulo, adaptador y accion que desea ejecutar el cliente asi como sobre cualquier parametro que se introdujo en la url. Por eso decimos que esta clase es la puerta de entrada que nos permite la comunicacion con el usuario de una manera segura, pues la misma analiza la peticion que llega por la URL, la filtra y nos proporcion informacion de la peticion.
Desde el sistema podremos acceder a la misma desde el Registry:
\agenor\mva\Registry::get('Request')
Veamos un volcado del objeto Request:
object(agenor\mva\Request)#2 (5) {
  ["_modulo":"agenor\mva\Request":private]=>
  string(4) "form"
  ["_controlador":"agenor\mva\Request":private]=>
  string(5) "Index"
  ["_accion":"agenor\mva\Request":private]=>
  string(5) "index"
  ["_args":"agenor\mva\Request":private]=>
  array(4) {
    [0]=>
    string(6) "param1"
    [1]=>
    string(6) "value1"
    [2]=>
    string(6) "param2"
    [3]=>
    string(6) "value2"
  }
  ["_argsAsociativo":"agenor\mva\Request":private]=>
  array(3) {
    ["URL"]=>
    array(2) {
      ["param1"]=>
      string(6) "value1"
      ["param2"]=>
      string(6) "value2"
    }
    ["GET"]=>
    array(0) {
    }
    ["POST"]=>
    array(6) {
      ["name"]=>
      string(8) "por form"
      ["date"]=>
      string(8) "2013-W05"
      ["nombres"]=>
      string(2) "10"
      ["sdsdsd"]=>
      string(7) "#FF0000"
      ["hidden"]=>
      string(13) "Eliminando..."
      ["submit"]=>
      string(6) "Enviar"
    }
  }
}
Como podemos ver la clase guarda ademas de la informacion de que ejecutar (modulo/adaptador/accion), contiene los argumentos pasados por url en la variable _args, luego _argsAsociativo que es un arreglo multidemensional, que guarda pares de claves y valor pasados por URL, POST y GET.

Metodos utiles
Aparte de los metodos comunes set y get sobre modulo, adaptador y accion, podemos encontrar metodos utiles sobre los datos pasados por url o metodos post y get.
Primero obtendremos la instancia de la clase y la usaremos para ver sus metodos.
$peticion = \agenor\mva\Registry::get('Request')

  RECORDAR :
Para los metodos de obtencion de parametros GET, POST y por URL, generalmente en nuestra clase adaptadora tendremos disponible metodos mas especificos.


$peticion->getArgs(void) : array
Nos retorna un arreglo que contiene los datos pasados por url. Tiene el filtrado mas basico, y no separa entre parametro y valor. El resultado seria:
array(4) {
    [0]=>
    string(6) "param1"
    [1]=>
    string(6) "value1"
    [2]=>
    string(6) "param2"
    [3]=>
    string(6) "value2"
  }   
Este arreglo es con indices numerico y cada dato pasado por url separado por la diagonal (/), que no representan al modulo, adaptador o accion, conforman los valores del array.

$peticion->getArgsGet(void) : array
$peticion->getArgsAll(void) : array (alias)
Este metodo getArgsGet, nos retorna un arreglo multidimensional asociativo, compuesto por tres claves principales, URL, GET, POST que se corresponden con los pares clave, valor pasador por url separados por la diagonal(URL), los pares clave, valor provenientes por url pero con el metodo GET, que son aquellos que vienen luego del simbolo de interrogacion (?) y por ultimo los pares clave, valor provenientes del metodo POST. En definitiva el arreglo retornado seria como el que sigue:
array(3) {
    ["URL"]=>
    array(2) {
      ["param1"]=>
      string(6) "value1"
      ["param2"]=>
      string(6) "value2"
    }
    ["GET"]=>
    array(0) {
    }
    ["POST"]=>
    array(6) {
      ["name"]=>
      string(8) "por form"
      ["date"]=>
      string(8) "2013-W05"
      ["nombres"]=>
      string(2) "10"
      ["sdsdsd"]=>
      string(7) "#FF0000"
      ["hidden"]=>
      string(13) "Eliminando..."
      ["submit"]=>
      string(6) "Enviar"
    }
  }
}   
Todos los datos obtenidos por este metodo, cuentan con una sanitizacion previa con la funcion filter_var de php y utilizando el filtro FILTER_SANITIZE_STRING.

$peticion->setArgs(string $tipo, array $args) : void
Nos permite incluir valores a la peticion realizada por el usuario ya sea en parametros GET, POST o pasados por URL.
$tipo : Tipo de entorno del parametro GET/POST/URL.
$args: Arreglo asociativo con pares clave, valor.

Seguridad de Request
Probamos nuestra clase con ataques de tipo XSS extraidos de la siguiente direccion web: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet, el testeo fue enviar a traves de variables GET los ataques y luego imprimir la variable sanitizada y sin sanitizar. Agenor se comporto muy bien sanitizando la larga lista enumerada del enlace.

  INYECCION SQL :
En el caso de este tipo de ataques se sugiere utilizar PDO, para prevenir los mismos.


 Clase RequestGet

No lo mencionamos antes pero, toda clase Request de Agenor debe implementar la interface RequestInterface, esto es asi puesto que muchas veces nos encontramos con sitios donde no nos permiten el uso del modo rewrite, y entonces podemos hacer andar la libreria cambiando en el index de nuestra aplicacion la clase Request en uso.

En el index por defecto tenemos,
   
<?php \agenor\mva\Router::getInstance()->run(new \agenor\mva\Request(), array('application'));

Como podemos apreciar en el metodo run el primer parametro es new \agenor\mva\Request(), Request implementa a RequestInterface y es el encargado de dar toda la informacion al router del sistema sobre nuestra URL y parametros. Pero dicha clase Request lo hace en un entorno de ejecucion con el modo rewrite activado, pero si este no es el caso podremos usar la libreria pasando a el metodo run como parametro la clase RequestGet que tambien implementa RequestInterface.

Si estamos en este ultimo caso nuestra url cambiara:
http://localhost/agenor/?mod=index&adp=Manual&acc=seccion/page/p003_conceptos
donde mod es el modulo, adp es el adaptador y acc es la accion luego la barra y los parametros pasados por URL, en este caso el parametro page tiene el valor p003_conceptos.

┬┐Pero solo con cambiar Request por RequestGet funciona?

No, no solo se requiere ese cambio si no que todas las url esten realizadas de la forma correcta, por lo cual no es conveniente marcar a fuego los enlaces en nuestro codigo.
Para tener los enlaces correctos y no preocuparnos de la clase RequestInterface que usemos esta ultima nos obliga a tener un metodo llamado buildUrl, que es un metodo constructor de URL's de acuerdo a nuestra implementacion.

<?php
    
public static function buildUrl($modulos$adaptador$accion, array $params = array(), $http URL_HTTP);
Con este metodo todas nuestras URL quedaran formadas de la manera correcta, pero para no preocuparnos para saber donde esta nuestra clase de generacion de urls, la vista nos provee del metodo url, con lo cual para pasar la url del ejemplo hariamos desde la vista:
$this->url('index', 'Manual', 'seccion', array('page', 'p003_conceptos'));

 IMPORTANTE :

Si bien usar este metodo nos da flexibilidad, tambien es cierto que genera un retraso en la ejecucion del codigo. Por eso se debera evaluar si el entorno de ejecucion variara tanto como para ser necesario usar este tipo de implementacion.