Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO ¿Una manera inteligente de recoger $_POST?

Estas en el tema de ¿Una manera inteligente de recoger $_POST? en el foro de PHP en Foros del Web. Tengo un esquema tanto conceptual como en código de lo que debe ser un frontcontroller para que el usuario navegue por la web mediante $_GET. ...
  #1 (permalink)  
Antiguo 02/06/2014, 09:35
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
¿Una manera inteligente de recoger $_POST?

Tengo un esquema tanto conceptual como en código de lo que debe ser un frontcontroller para que el usuario navegue por la web mediante $_GET.

Ahora tengo una duda y no tengo claro qué opción aplicar, me refiero a recoger $_POST.

Supongamos la siguiente situación:

Un usuario llega al home de la web, y le muestro un formulario que se enviará mediante $_POST.

Las dudas son ¿Dónde envío ese formulario?

¿Directamente a la clase y aprovecho la lectura de $_GET en el index.php para detectar $_POST así por ejemplo?

Código PHP:
Ver original
  1. try{
  2.                         if(filter_input_array(INPUT_GET, $_GET) !== NULL){
  3.                         echo (new \controller\FrontController())->invoke(filter_input(INPUT_GET, $_GET['class']),
  4.                                 filter_input(INPUT_GET, $_GET['method']),
  5.                                 filter_input(INPUT_GET, $_GET['args']));
  6.                         }
  7.                        
  8.                         if(filter_input_array(INPUT_POST, $_POST) !== NULL)
  9.                                 (new controller\BackController())->invoke(filter_input(INPUT_POST, $_POST['class']),
  10.                                 filter_input(INPUT_GET, $_POST['method']));
  11.                        
  12.                     } catch (Exception $ex) {
  13.                         echo $ex;
  14.                     }

Y con esto haría una reconocimiento (isset) de $_POST en la clase y usaría los $_POST[''] que necesitara.

Otro modo es enviando el formulario al documento donde está la clase y con un try-catch haría un reconocimiento (isset) de $_POST e instanciaría la clase con tantos $_POST que necesite como argumentos.

No se me ocurre muchas más variantes, todas van por este estilo.

Recalcar que el frontcontroller que he construido (sin utilizar Reflection en el código) funciona perfectamente.

Un saludo.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 02/06/2014, 10:19
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: ¿Una manera inteligente de recoger $_POST?

La pregunta es previa: tiene alguna utilidad diferenciar entre parámetros GET y POST ? El formato que utilice el protocolo HTTP para enviar información a la página, pertence a ese protocolo, HTTP.Yo, personalmente, no los diferencio.Mis páginas reciben "parámetros", independientemente de que sean $_GET o $_POST
  #3 (permalink)  
Antiguo 02/06/2014, 10:28
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: ¿Una manera inteligente de recoger $_POST?

Creo que sí tiene utilidad, porque con GET el usuario navega a través de la web:

www.miweb.com/biblioteca/nuevo-libro/

Con eso el usuario directamente estaría instanciando a la clase biblioteca y el método nuevo-libro.

Ahora bien, si el usuario envía el formulario con los datos de un nuevo libro, lo envía mediante POST, y con POST hay que indicar a dónde envía el formulario, entonces ahí ya hay una primera pregunta: ¿Cómo y dónde recojo POST para instanciar la clase que procese esa información?

Resumiendo, creo que solamente hay que utilizar GET para navegar mediante la web y POST para enviar la información entre usuario y servidor (en un ambiente donde no hay javascript, solamente PHP y HTML).

Tal vez en otros frameworks profesionales no haya que hacer la diferencia, pero lo que estoy haciendo y entiendo yo sí tengo esa necesidad de hacer la diferencia, porque con POST no puedes navegar por la web de forma que quede un rastro en el PATH del navegador y el usuario pueda acceder directamente a una sección sin tener que seguir pasos previos, como por ejemplo, ingresar un nuevo libro sin tener que comenzar desde el home.
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 02/06/2014, 10:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por dashtrash Ver Mensaje
La pregunta es previa: tiene alguna utilidad diferenciar entre parámetros GET y POST ? El formato que utilice el protocolo HTTP para enviar información a la página, pertence a ese protocolo, HTTP.Yo, personalmente, no los diferencio.Mis páginas reciben "parámetros", independientemente de que sean $_GET o $_POST
Cierto, pero que no tome tu consejo como ... "usa $_REQUEST" por motivos obvios

De todas formas seria hasta mas seguro que se permitan 'actions' del tipo "delete", "update", "create" provinientes por POST unicamente... claro que obligaria a usar convenciones
__________________
Salu2!
  #5 (permalink)  
Antiguo 02/06/2014, 10:51
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: ¿Una manera inteligente de recoger $_POST?

Si lo necesitais, os puedo dejar el código del pequeñísimo framework que estoy creando para que vean del por qué concluí con la necesidad de diferenciar entre POST y GET. Sin ningún problema, pero ojo, la idea no es mía.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 02/06/2014, 16:40
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Creo que sí tiene utilidad, porque con GET el usuario navega a través de la web:

www.miweb.com/biblioteca/nuevo-libro/

Con eso el usuario directamente estaría instanciando a la clase biblioteca y el método nuevo-libro.
Da igual que al funcionamiento del sistema le lleguen parámetros por GET,POST o la Url de la request. Que se instancie una clase y se llame a un método no depende de que la petición http que llega a tu servidor contenga los parámetros codificados de una forma u otra.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Ahora bien, si el usuario envía el formulario con los datos de un nuevo libro, lo envía mediante POST
...o por GET, si quieres.Porque son intercambiables.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Resumiendo, creo que solamente hay que utilizar GET para navegar mediante la web y POST para enviar la información entre usuario y servidor
Y, si eso es lo que piensas, que es la convención habitual, y tomando exactamente esa frase, para qué necesitas diferenciar GET y POST más allá del enrutador?
  #7 (permalink)  
Antiguo 02/06/2014, 17:00
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por Italico76 Ver Mensaje
Cierto, pero que no tome tu consejo como ... "usa $_REQUEST" por motivos obvios

De todas formas seria hasta mas seguro que se permitan 'actions' del tipo "delete", "update", "create" provinientes por POST unicamente... claro que obligaria a usar convenciones
Creo que no me explico.Cómo se comunique un navegador web con un servidor http, sea por POST,GET,PUT,DELETE,etc, da lo mismo.Pertenece al protocolo HTTP.
Esa información puede ser usada por el enrutador de PHP , ya que PHP se utiliza para extender la gestión de Urls (cosa que teóricamente hace el servidor web).
Pero al controlador, de dónde han llegado los parámetros, debería darle igual.Como si le llegan de un fichero.
Y, precisamente por cuestiones de seguridad, es por lo que para cada página especifico qué parámetros existen, y su tipo.El enrutador comprueba la existencia de esos parámetros, los sanitiza, los almacena en un registro y establece GET y POST a NULL.
Así mi equipo no tiene la tentación de usar $_GET o $_POST en sitios donde sí que se produciría un problema de seguridad.
  #8 (permalink)  
Antiguo 03/06/2014, 13:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por dashtrash Ver Mensaje
Creo que no me explico.

Cómo se comunique un navegador web con un servidor http, sea por POST,GET,PUT,DELETE,etc, da lo mismo.Pertenece al protocolo HTTP.
Con todo respeto ....




Creo estamos armando mas confusion porque ni siquiera HTML5 soporta PUT ni DELETE ni HEAD y cuando se implementa es por debajo mediante POST

En aplicaciones WEB no se usa mas que POST y GET porque los otros tipos de REQUESTs no son soportados mas alla de un contexto Ajax.
__________________
Salu2!
  #9 (permalink)  
Antiguo 03/06/2014, 13:55
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por Italico76 Ver Mensaje
[...] Creo estamos armando mas confusion porque ni siquiera HTML5 soporta PUT ni DELETE ni HEAD y cuando se implementa es por debajo mediante POST [...]
Bueno, seguramente necesitas informarte más para no confundirte sólo, HTTP no es parte de HTML5, son cosas diferentes.

Ahora, dichos métodos son soportados, si no me crees crea un objeto XMLHttpRequest y establece el método a mano, verás que sí funciona.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 03/06/2014, 14:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por Italico76 Ver Mensaje
no son soportados mas alla de un contexto Ajax.
>> me referia a esto
__________________
Salu2!
  #11 (permalink)  
Antiguo 03/06/2014, 14:23
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: ¿Una manera inteligente de recoger $_POST?

Bueno, seguramente te referías a un formulario tradicional de HTML pues HTML5 se suele entender como un conjunto de tecnologías modernas para web: HTML5 per se, Javascript (ES5) y CSS3.

O al menos así lo interpreto yo, por ende mi respuesta.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 03/06/2014, 14:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Una manera inteligente de recoger $_POST?

Si Sr, me referia a:

Código HTML:
Ver original
  1. <FORM action="DELETE">
__________________
Salu2!
  #13 (permalink)  
Antiguo 03/06/2014, 15:05
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: ¿Una manera inteligente de recoger $_POST?

Cita:
Iniciado por dashtrash Ver Mensaje
Da igual que al funcionamiento del sistema le lleguen parámetros por GET,POST o la Url de la request. Que se instancie una clase y se llame a un método no depende de que la petición http que llega a tu servidor contenga los parámetros codificados de una forma u otra.


...o por GET, si quieres.Porque son intercambiables.


Y, si eso es lo que piensas, que es la convención habitual, y tomando exactamente esa frase, para qué necesitas diferenciar GET y POST más allá del enrutador?
Lo necesito por dos motivos obvios:

1) POST y GET son variables superglobales, vale, pero

¿cómo le digo al programa que está en una clase y no en un código suelto, sin encapsular que me ejecute una clase y no otra, un método y no otro?


2) Para que los datos que el usuario ponga en el formulario no se sumen al path del navegador.

Si con .htaccess realizo esto para que me separe los datos GET en tres conjuntos:

class, method y args

Código Apache:
Ver original
  1. <IfModule mod_rewrite.c>
  2.     RewriteEngine On
  3.     RewriteCond %{REQUEST_FILENAME} !-f
  4.     RewriteRule ^([^/]*)/*([^/]*)/*(.*)$ index.php?class=$1&method=$2&args=$3
  5. </IfModule>

Ahora supongamos un formulario enviado por post para que un usuario desde el home se suscriba al newsletter que tuviera esta estructura

Código HTML:
Ver original
  1. <form method="post" action="">
  2.     <label for="newsletter">Recibe noticias sobre mi, introduce tu correo electrónico</label>
  3.     <input type="email" name="newsletter" id="newsletter" class="newsletter">
  4.     <input type="submit" name="submit_newsletter" id="submit_newsletter" class="submit_newsletter">
  5. </form>

Si por GET el usuario va instanciando sobre clases ¿qué debería poner en el action del form para que la clase indicada se ejecute? Evidentemente con los nombres explícitos de los parámetros que debe recibir por POST pero ¿cómo ejecuto esa clase?



Paketetrueke, creía que HTML5 es simplemente la última versión de HTML. Cada día aprendo más con vosotros :D

(Lamento haber tardado en responder, pero desde ayer noche que intenté cada 2x3 entrar al foro pero se ve que hubo problemas con el/los servidor/es.)
__________________
Ayúdame a hacerlo por mi mismo.
  #14 (permalink)  
Antiguo 04/06/2014, 10:24
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: ¿Una manera inteligente de recoger $_POST?

Creo que te estas complicando, lo que necesitas es únicamente capturar todas las peticiones y enviarlas a tu index.php
Código Apache:
Ver original
  1. <IfModule mod_rewrite.c>
  2.             RewriteEngine On
  3.             RewriteCond %{REQUEST_FILENAME} !-f
  4.             RewriteRule ^(.*)$ /index.php [QSA,L]
  5. </IfModule>

Las responsabilidad de tu Front Controller son las de recibir e inspeccionar la petición y determinar que esta mapeado a la url para ejecutarlo.
La forma básica es usando el patrón request/respònse que dicho sea de paso no es nuevo ya lo conoces de una u otra forma. El detalle es que trabajas con objetos, asi que tu petición a través de una URL la tienes que transformar a un objeto que puede usar el Front Controller para tomar decisiones (Service Controller ). y a su vez pueda ser manejado por otros componentes, como pasarlo al controlador y desde el, acceder a get o post si es el caso.
Los dos patrones estan explicados en el libro Servce Design Pattern, las ligas son parte del catalogo. Date un tiempo para leer te va ahorrar problemas y te va ayudar a comprender como hacen las cosas otros frameworks y sobre todo a tener herramientas para tomar decisiones de diseño o para aplicar el principio de otra forma.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #15 (permalink)  
Antiguo 04/06/2014, 14:21
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: ¿Una manera inteligente de recoger $_POST?

Muchas gracias a todos. He aprendido en este hilo.

Pude solucionar mi problema, que era el siguiente:

Cuando aprendí sobre formularios en HTML, lo que entendí es que el form tiene dos métodos (POST y GET), y entendí que la forma de enviar el form también varía según el method.

Es decir, si en el action yo escribo

Código HTML:
Ver original
  1. <form method="post" action="index.php?input=2&type=response">

Entendía que lo que estaba haciendo era enviar a index.php los datos por post.

Lo que no caí en la cuenta es que el action se envía por GET. Esa era la pieza que me faltaba para entender que da igual qué datos envíe, porque la ruta para enviarlos es por GET y una vez ya mediante GET instancie la clase y acceda al método concreto, ya ahí filtro el POST y descarto o incluyo parámetros.

Un dolor de cabeza debido a mi ignorancia en ese detalle.

Gracias a todos!!!
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: formulario, inteligente, manera, recoger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:23.