Foros del Web » Programando para Internet » PHP » Zend »

Controlar error de url en plugin

Estas en el tema de Controlar error de url en plugin en el foro de Zend en Foros del Web. Buenas, Llevo toda la tarde liado con esto y no doy con la solución, o igual es que no se puede. La idea es que ...
  #1 (permalink)  
Antiguo 15/08/2012, 13:37
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 7 meses
Puntos: 261
[SOLUCIONADO] Controlar error de url en plugin

Buenas,

Llevo toda la tarde liado con esto y no doy con la solución, o igual es que no se puede.

La idea es que un Controller_Plugin se encargue de montar el Acl.

Los Resources, se basan en MODULE_CONTROLLER_ACTION.

Como son bastantes, y van aumentando, intento crear un sistema para añadirlos automáticamente a la DB, pero filtrando las rutas que se inserten mal.

De modo, que la secuencia sería:

1.- Entras en: dominio.com/default/index/index
Esto pide un Resource de tipo DEFAULT_INDEX_INDEX

2.- Primero comprobar si la ruta se puede despachar (Aquí es donde me encuentro atascado)

3.a.- Si la ruta se puede despachar, comprueba si existe el Resource y pasa al punto 4.a o 4.b.

3.b - Si la ruta no se puede despachar, da el error correspondiente y no comprueba el resoource.

4.a- Si existe el resource lo pasa a $acl->isAllowed()

4.b- Si no existe el resource, lo añade a la Db, limpia la cache y recarga la página.

Estoy probando con esto, pero resulta que si el module o el controller esta mal, si me retorna false, pero si es el action el que esta mal me retorna true.

Al retornar true, por ejemplo, puede crearme un Resource de tipo DEFAULT_INDEX_IND, creando entradas inecesarias.
Código PHP:
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
    
$front Zend_Controller_Front::getInstance();

    if( 
$front->getDispatcher()->isDispatchable($request) )
    {
        
// dispatchable
    
}
    else
    {
        
// else show the error
    
}

De que forma se puede comprobar que la ruta entera es correcta?

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight

Última edición por Uncontroled_Duck; 17/08/2012 a las 07:52 Razón: Añadir solucionado el título
  #2 (permalink)  
Antiguo 17/08/2012, 07:51
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 7 meses
Puntos: 261
[SOLUCIONADO] Respuesta: Controlar error de url en plugin

Buenas, al final lo he solucionado de otra forma, no se si será buena, pero al menos funciona y controla lo que esperaba.

Probé con el ejemplo que viene en el manual de Zend, control de excepciones, pero me daba error el ejemplo que tienen. (Lo pongo mas abajo por si alguien le sirve o quiere probarlo)

Entonces, encontré esta función en stackoverflow, que con un par de ajustes se adapta a lo que buscaba.

Con la función $this->_actionExists, comprueba en el array que existen los modulos, controllers y actions que se piden.

En función de si retorna true o false, despacha el error, continua con el acl, o añade el nuevo recurso a la db para gestionar después los permisos.

Código PHP:
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    
// else show the error
    
$this->_mca false;
    if( 
$frontController->getDispatcher()->isDispatchable($request) &&
        
$this->_actionExists($module$controller$action) )
    {
        
// if dispatchable do some stuff
        
$this->_mca true;
    }


Código del Manual Zend
Código PHP:
class My_Controller_PreDispatchPlugin extends Zend_Controller_Plugin_Abstract
{
    public function 
preDispatch(Zend_Controller_Request_Abstract $request)
    {
        
$front      Zend_Controller_Front::getInstance();
        
$dispatcher $front->getDispatcher();
        
$class      $dispatcher->getControllerClass($request);
        if (!
$controller) {
            
$class $dispatcher->getDefaultControllerClass($request);
        }

        
$r      = new ReflectionClass($class);
        
$action $dispatcher->getActionMethod($request);

        if (!
$r->hasMethod($action)) {
            
$defaultAction  $dispatcher->getDefaultAction();
            
$controllerName $request->getControllerName();
            
$response       $front->getResponse();
            
$response->setRedirect('/' $controllerName
                                  
'/' $defaultAction);
            
$response->sendHeaders();
            exit;
        }
    }

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #3 (permalink)  
Antiguo 17/08/2012, 09:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Controlar error de url en plugin

Muy bien, no se me ocurrió como hacerlo realmente, gracias por compartir tu aporte

Etiquetas: controlar, plugin, url
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 22:12.