Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Vale ->dispatch(); si... ¿ pero y los argumentos ?

Estas en el tema de Vale ->dispatch(); si... ¿ pero y los argumentos ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. He visto tutoriales de mvc y frontController y hay cosas que me dejan totalmente bloqueado. Sabría ahora hacer un metodo dispatch que llamase a un ...
  #1 (permalink)  
Antiguo 13/09/2008, 11:13
 
Fecha de Ingreso: agosto-2008
Mensajes: 21
Antigüedad: 15 años, 8 meses
Puntos: 0
Vale ->dispatch(); si... ¿ pero y los argumentos ?

He visto tutoriales de mvc y frontController y hay cosas que me dejan totalmente bloqueado.

Sabría ahora hacer un metodo dispatch que llamase a un determinado controlador y una determinada acción
$fc = FrontController::getInstance();
$fc->dispatch();
y los tutoriales que he visto, ese dispatch haría en algún momento esto:
$controller = new $controllerName();
$controller->$actionName();
De forma que se llamaría al controlador y a la acción correspondiente...

¡¡¡¡ ¿ Pero y los argumentos de las acciones ? !!!!

¿ Ahí se ejecutaría $actionName sin argumentos, no ? Entonces que pasa, esos tutoriales no contemplan pasar argumentos ? ¿ O donde/como los consiguen ?

Alguién podría aclararme un poco esto ? Gracias !
  #2 (permalink)  
Antiguo 13/09/2008, 14:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

Hola Electrify,

Si te refieres a los argumentos que podrian llegar por GET o por POST, esos hay varias formas de rescatarlos.

Desde la forma más simple, que es usando $_GET, y $_POST directamente (son variables super globales). A usar modos más OOP, por ejemplo en Zend usas:
Código PHP:
public function indexAction() {
       
$request $this->getRequest();
       
$param $request->getParam("param");

Todo depende de tu implementación, no todos los routers usan el mismo método.

Saludos.
  #3 (permalink)  
Antiguo 14/09/2008, 09:49
 
Fecha de Ingreso: agosto-2008
Mensajes: 21
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

Si, a ello iba. Me daba la sensación de que en algunas implementaciones de mvc las acciones no son las encargadas de recibir los parametros mediante sus propios argumentos. Sinó que se hace por mensajes entre objetos. Me chocaba ver un controlador lleno de acciones, sin ni un solo argumento, que sin embargo despues aparecían en la vista. Automáticamente pensaba... ¿ y de donde los saca ?

Creo que es un detalle que a menudo se sobreentiende y no se explica explicitamente. Y para los que todavía no estamos muy acostumbrados a trabajar con objetos... pues se puede pasar por alto facilmente.
  #4 (permalink)  
Antiguo 14/09/2008, 10:22
 
Fecha de Ingreso: agosto-2008
Mensajes: 21
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

Pero entonces, de que forma me aconsejariais enviar esas peticiones ?

He visto tutoriales en los cuales hacen uso de mod_rewrite para embellecer las url. Pero algunos también lo usan para cambiar de lógica. Me explico:

Hay algunos que hacen algo similar a:

RewriteEngine On
RewriteRule ^(.*)$ index.php$1

De forma que al obtener el request_uri obtendrian algo asi como:

ruta/ruta2/controller/action/arg1/arg2/argN

Y a partir de ahí gestionan lógicamente desde código... Comprueban si controller es una clase... y si action es una función, sinó las definen como index y recogen los argumentos sobrantes a menudo con un explode("/", ArraydeArgumentos).

Pero esto... Ese request_uri, no deja de ser una simple string ( es lo que también llaman "command", no ? ) y hacerlo así te dejaría sin poder reconocer esos argumentos mediante $_GET o $_POST, no ? ya que tu pasas una ruta inexistente, que gracias a mod_rewrite no se procesa... pero en ningún momento usas así gets, o posts

Entonces... que recomendarían ?

- Manejar lógicamente la string y olvidarnos de las superglobales :S...
- O crear un query string tradicional ruta/ruta2/index.php?controller=valor1&action=valor2&argN=val orN e ir haciendo que mod_rewrite transforme las url ?

Que es más aconsejable ? O dirían exhaltados "De ninguna de las maneras !!!" jajaja

Gracias !!! : )
  #5 (permalink)  
Antiguo 14/09/2008, 15:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

Hola Electrify,

La ventaja de manejar tu lógicamente el string es que puedes realizar procesos más a fondo con los elementos, por ejemplo filtrar las variables, quitar html, prevenir ataques XSS etc. todo de forma automática.

Con esto ya al tu rescatar las variables directo en el controlador ya viene "limpia", y solo te preocupas por hacer el proceso sabiendo que las variables son seguras.

Al tu usar $_POST, $_GET etc, tienes que comprobar todas tus variables en el controlador lo que hace que tengas que "re-trabajar". Recuerda que la ventaja de estar haciendo las cosas más ordenadamente, trabajando con MVC, y POO, es ahorrar trabajo.

Saludos.
  #6 (permalink)  
Antiguo 14/09/2008, 19:14
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

En el caso de Zend Framework, es el "Router" el que mapea la url a sus respectivos pares (parámetro; valor).

Luego, se capturan en cada acción como dice GatorV.

Por defecto, el Router de un FrontController es el Rewrite (el que usa la url reescrita), pero hay otros más disponibles. Es decir, si no estableces uno manualmente, ESE será el que estará funcionando.

Para usar el Zend_Controller_Router_Rewrite, es necesario hacer la regla de reescritura de url.
__________________
Blog | Tecnosquad
  #7 (permalink)  
Antiguo 14/09/2008, 20:10
 
Fecha de Ingreso: agosto-2008
Mensajes: 21
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

GatorV:
Entiendo, mejor string entonces. Además con argumentos de peso.

ArrauKano:
Entiendo, antes estaba confundido por que pensaba que la clase que se usaba por defecto sería Zend_Controller_Router_Route, pero esta es una clase que define una entidad, "la ruta", no ? Me recuerda a un patrón que se usa en los modelos... De forma que se hace una clase por ejemplo "Usuario" con sus atributos... ¿ Como se llama ese patrón ? No lo recuerdo...

Según GatorV los parametros los recogeríamos desde un objeto Request... ¿ El Router se los devolvería a Request ?

Osea que Zend_Controller_Router_Rewrite dispone unas pocas rutas predefinidas y lás demás se crean especificamente... Bueno, de todas formas, si me pusiera ahora con ZF* creo que no me harían falta nada más que las que vienen por defecto.

Gracias a los dos !

Última edición por Electrify; 15/09/2008 a las 07:05
  #8 (permalink)  
Antiguo 15/09/2008, 10:37
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

Cita:
Iniciado por Electrify Ver Mensaje
GatorV:
Entiendo, mejor string entonces. Además con argumentos de peso.

ArrauKano:
Entiendo, antes estaba confundido por que pensaba que la clase que se usaba por defecto sería Zend_Controller_Router_Route, pero esta es una clase que define una entidad, "la ruta", no ? Me recuerda a un patrón que se usa en los modelos... De forma que se hace una clase por ejemplo "Usuario" con sus atributos... ¿ Como se llama ese patrón ? No lo recuerdo...

Según GatorV los parametros los recogeríamos desde un objeto Request... ¿ El Router se los devolvería a Request ?

Osea que Zend_Controller_Router_Rewrite dispone unas pocas rutas predefinidas y lás demás se crean especificamente... Bueno, de todas formas, si me pusiera ahora con ZF* creo que no me harían falta nada más que las que vienen por defecto.

Gracias a los dos !
Zend_Controller_Router_Route y Zend_Controller_Router_Rewrite pueden funcionar en conjunto. Por ejemplo, en mi aplicación ocupo el rewrite para obtener el módulo, el controlador, la acción y los parámetros. Pero además hice una regla del router para que la ruta "/error/*" apunte SIEMPRE a mi módulo-controlador-acción "index", así nunca un visitante podrá ver las acciones de error por la url a menos que efectivamente el sitio dispare un error.

Lo que hace el Router con el Request, como dije, es "mapear" las variables que capture vía url a sus respectivos parámetros-valores.

http://framework.zend.com/manual/en/...er.router.html
__________________
Blog | Tecnosquad
  #9 (permalink)  
Antiguo 15/09/2008, 13:25
 
Fecha de Ingreso: diciembre-2007
Mensajes: 13
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Vale ->dispatch(); si... ¿ pero y los argumentos ?

exelente informacion.
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 05:41.