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

Ejecutar siempre un mismo codigo al final de los metodos/funciones

Estas en el tema de Ejecutar siempre un mismo codigo al final de los metodos/funciones en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, Estoy haciendo un proyecto de una tienda online con un MVC. En la clase controlador en una propiedad guardo una referencia a la clase ...
  #1 (permalink)  
Antiguo 11/02/2013, 09:59
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 meses
Puntos: 0
Ejecutar siempre un mismo codigo al final de los metodos/funciones

Buenas,

Estoy haciendo un proyecto de una tienda online con un MVC.
En la clase controlador en una propiedad guardo una referencia a la clase de la vista.

Código PHP:
<?php

class inicioControlador extends Controlador
{
    public function 
__constructPeticion $peticion ) {
        
parent::__construct$peticion );
        
$this->_vista->titulo 'Gestion MiMascota.com';
    }
    
    public function 
inicio() {
        
$userModelo $this->cargaModelo("user");
        
$this->_vista->userId $userModelo->GetUserIdForUserToken823094712389 );
        
$this->_vista->renderizar('inicio');
    }

    public function 
pagina_no_encontrada()
    {
        
$this->_vista->titulo 'Pagina no encontrada';
        
$this->_vista->renderizar('pagina_no_encontrada');
    }
}

?>
Lo que busco es implementar de alguna forma si es que la hay para que no tenga que escribir siempre la última línea de renderizar la página.
Que en cada método del controlador al final se ejecuta la sentencia $this->_vista->renderizar(); sin tener que escribir este código en cada metodo.

Necesito ayuda y consejos. Gracias.
  #2 (permalink)  
Antiguo 11/02/2013, 11:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Formas automática no hay para eso, además de que es una muy mala idea.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/02/2013, 12:52
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Creo que Zend Framework en su versión 1, podes omitir el render y el lo hace solo.
Simplemente se basa en convenciones es decir tiene que seguir cierta nomenclatura para que ejecute la plantilla.
por ej. si el controlador es inicio y la accion pagina_no_encontrada, debe existir en el directorio de las vistas un directorio por cada Controlador, en este caso deberia existir un directorio inicio y dentro de este una plantilla con el nombre pagina_no_encontrada.phtml por ejemplo. (Este no es el ej. exacto de zf pero es la idea)

Luego supongo que el router( front controller) se podría encargar de ejecutar este método si no lo realizaste tu.

Yo estoy realizando una librería MVC y tuve la misma intencion y por ahi mas o menos lo solucione.

Saludos y Suerte
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #4 (permalink)  
Antiguo 11/02/2013, 13:15
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Para resolverlo a nivel de PHP tendrías que instalar algo como AOP-PHP, ahora para resolverlo a nivel de tu fw habría que ver como invocas al controlador y también saber que es lo que hace renderizar exactamente.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 11/02/2013, 14:14
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Cita:
Iniciado por portalmana Ver Mensaje
Creo que Zend Framework en su versión 1, podes omitir el render y el lo hace solo.
Simplemente se basa en convenciones es decir tiene que seguir cierta nomenclatura para que ejecute la plantilla.
por ej. si el controlador es inicio y la accion pagina_no_encontrada, debe existir en el directorio de las vistas un directorio por cada Controlador, en este caso deberia existir un directorio inicio y dentro de este una plantilla con el nombre pagina_no_encontrada.phtml por ejemplo. (Este no es el ej. exacto de zf pero es la idea)

Luego supongo que el router( front controller) se podría encargar de ejecutar este método si no lo realizaste tu.

Yo estoy realizando una librería MVC y tuve la misma intencion y por ahi mas o menos lo solucione.

Saludos y Suerte
Así es amigo, tal y como lo has descrito.
¿ Alguna solución ?
  #6 (permalink)  
Antiguo 11/02/2013, 14:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Como te dijeron los demás, como hacerlo depende de como este armado tu FW, ya que es algo que se ejecuta en el proceso del controlador frontal.

Saludos.
  #7 (permalink)  
Antiguo 11/02/2013, 14:22
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Lo primero y sobre todo GRACIAS por las respuestas y vuestra colaboración. Compartir ideas es bueno, pues las compartes con otras mentes pensantes quienes pueden darte también sus ideas para que tu valores en que medida son buenas/malas.

Cita:
Iniciado por masterpuppet Ver Mensaje
Para resolverlo a nivel de PHP tendrías que instalar algo como AOP-PHP, ahora para resolverlo a nivel de tu fw habría que ver como invocas al controlador y también saber que es lo que hace renderizar exactamente.

Saludos.
Lanzador o bootstrap:
Código PHP:
<?php

class Lanzador
{
    public static function 
runPeticion $peticion )
    {
        
$controlador $peticion->getControlador() . 'Controlador';
        
$rutaControlador DIR_CONTROLADORES $controlador '.php';
        
$accion $peticion->getAccion();
        
$argumentos $peticion->getArgumentos();

        if( 
is_readable$rutaControlador ) ){
            require_once 
$rutaControlador;
            
//$registro = new claseRegistro();
            
$controlador = new $controlador$peticion );

            if(
is_callable(array($controlador$accion))){
                if( empty(
$argumentos) == true ){
                    
call_user_func(array($controlador$accion));
                }
                else{
                    
call_user_func_array(array($controlador$accion), array( $argumentos ) ) ;
                }
                exit();
            }
        }
        
header('Location: '.PAGINA_ERROR_404);
    }
}

?>
Petición o Request:
Código PHP:
class Peticion
{
    private 
$_controlador;
    private 
$_accion;
    private 
$_argumentos;
    
    public function 
__construct()
    {
        if( isset(
$_GET['enlace']) ){
            
$enlace filter_input(INPUT_GET'enlace'FILTER_SANITIZE_URL);
            
$enlace explode('/'$enlace);
            
$enlace array_filter($enlace);
            
            
$this->_controlador strtolower(array_shift($enlace));
            
$this->_accion strtolower(array_shift($enlace));
            
$this->_argumentos $enlace;

            if( empty( 
$this->_controlador ) ){
                
$this->_controlador CONTROLADOR_POR_DEFECTO;
            }

            if( empty( 
$this->_accion ) ) {
                
$this->_accion ACCION_POR_DEFECTO;
            }

            if(!isset(
$this->_argumentos)){
                
$this->_argumentos = array();
            }
        }
    }
... 
En el archivo index donde redirijo todas las llamadas
Código PHP:
...
Lanzador::run( new Peticion );
... 
.htaccess
Código:
#Options +FollowSymLinks
RewriteEngine On
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule \.(gif|jpg|js|css|swf|png)$ - [L]
RewriteRule (.*)$ indice.php?enlace=$1 [QSA,L]

PD: ¿ Hay alguna opción para copiar en el porta papeles el texto del mensaje que estas editando ? Por que sería una buena cosa ponerlo como opción o añadirlo al botón de [ Guardar ] para que cuando clickeas en guardar y otro ha contestado y no puedes editar el mensaje, tengas el texto guardado en el porta papeles y no tengas que volver a escribirlo. ¿ Que me decís ? jejeje

Última edición por chemajmb; 11/02/2013 a las 14:31
  #8 (permalink)  
Antiguo 11/02/2013, 14:58
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

No se como sera tu vista, pero por ej. poner una bandera que indique si ya se renderizo la vista o no, y luego la clase principal que lleva el control del programa se fije si esta renderizada la vista en base a esa bandera y renderize ella o no...

Esto es algo rápido que se me ocurre...

Salduos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #9 (permalink)  
Antiguo 11/02/2013, 14:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Pues revisa como esta el frontController de Zend, básicamente inspecciona el resultado de tu llamada en el Lanzador y después de este haces el rendereo de la vista, lo que hace Zend es tener el helper para la vista ya configurado para poder llamarlo desde varios lados y así puede ver que acción/controlador era y definir que acción por defecto mostrar.

Saludos.
  #10 (permalink)  
Antiguo 11/02/2013, 15:50
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Un momento
  #11 (permalink)  
Antiguo 11/02/2013, 15:57
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Pues he hecho esto, no se si esta decente, mal o se puede mejorar, etc. pero asi lo he hecho.

Clase Vista
Código PHP:
abstract class ClaseVista{
    
    private 
$_peticion;
    private 
$_css;
    private 
$_themes;
    private 
$_js;
    private 
$_jsPlugin;
    private 
$_acl;
    private 
$_rutas;
    protected 
$_plantilla;
    protected 
$_marco;

    public function 
__constructPeticion $peticion ) {
        
$this->_peticion $peticion;
        
$this->_themes = array();
        
$this->_css = array();
        
$this->_js = array();
        
$this->_jsPlugin = array();
        
//$this->_acl = $_acl;
        
$this->_rutas = array();
        
$this->_plantilla $peticion->getAccion();
        
$this->_marco 'default';
        
$this->_mostrar true;
    }

    public function 
renderizar()
    {
        if ( 
$this->_mostrar == null)
            exit();

        
$rutaPlantilla DIR_VISTAS $this->_peticion->getControlador() . DS $this->_plantilla '.phtml';

        if( 
is_readable$rutaPlantilla ) ){

            
$class_vars get_class_varsget_class$this ) );
            
$class_properties get_object_vars$this );
            
$class_data array_diff_key $class_properties $class_vars );
            foreach (
$class_data as $key => $value)
                $
$key $value;

            
// incluyo las plantillas phtml
            
if ( !$this->_marco){
                include_once ( 
$rutaPlantilla );
                exit();
            }
            include_once ( 
DIR_VISTAS 'layout' DS 'cabecera_html.phtml' );
            include_once ( 
DIR_VISTAS 'layout' DS $this->_marco DS 'cabecera.phtml' );
            include_once ( 
$rutaPlantilla );
            include_once ( 
DIR_VISTAS 'layout' DS $this->_marco DS 'pie.phtml' );
        }else {
            throw new 
MiExcepcion('Error de vista',array('rutaPlantilla' => $rutaPlantilla'plantilla' => $plantilla'marco' => $marco));
        }
    }
... 
Clase Lanzador o Bootstrap:
Código PHP:
<?php

class Lanzador
{
    public static function 
runPeticion $peticion )
    {
        
$controlador $peticion->getControlador() . 'Controlador';
        
$rutaControlador DIR_CONTROLADORES $controlador '.php';
        
$accion $peticion->getAccion();
        
$argumentos $peticion->getArgumentos();

        if( 
is_readable$rutaControlador ) ){
            require_once 
$rutaControlador;
            
//$registro = new claseRegistro();
            
$controlador = new $controlador$peticion );

            if(
is_callable(array($controlador$accion))){
                if( empty(
$argumentos) == true ){
                    
call_user_func(array($controlador$accion));
                }
                else{
                    
call_user_func_array(array($controlador$accion), array( $argumentos ) ) ;
                }
                
$controlador->getVista()->renderizar();
                exit();
            }
        }
        
header('Location: '.PAGINA_ERROR_404);
    }
}

?>
Lo único que tengo que hacer si en algún método no necesito mostrar la vista, es llamar el metodo $this->_vista->noMostrar() que me modifica la propiedad de $_mostrar a false.

Incluso si quiero rizar el rizo puedo optar por llamar a los metodos que no vayan a mostrar vista con un nombre que empiece o termine por una cadena de caracteres especifica a comprobar y si es igual a esa cadena, simplemente pongo la propiedad de $this->_mostrar a false.

Última edición por chemajmb; 11/02/2013 a las 16:11
  #12 (permalink)  
Antiguo 11/02/2013, 16:59
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Así funciona, no se si sera la mejor forma de resolverlo pero funciona...

Saludos y suerte con tu proyecto...
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #13 (permalink)  
Antiguo 12/02/2013, 16:04
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: Ejecutar siempre un mismo codigo al final de los metodos/funciones

Solución sencilla:
Código PHP:
Ver original
  1. class inicioControlador extends Controlador
  2. {
  3.     public function __construct( Peticion $peticion ) {
  4.         parent::__construct( $peticion );
  5.         $this->_vista->titulo = 'Gestion MiMascota.com';
  6.     }
  7.    
  8.     private function _inicio() {
  9.         $userModelo = $this->cargaModelo("user");
  10.         $this->_vista->userId = $userModelo->GetUserIdForUserToken( 823094712389 );
  11.    
  12.     }
  13.  
  14.     private function _pagina_no_encontrada()
  15.     {
  16.         $this->_vista->titulo = 'Pagina no encontrada';    
  17.     }
  18.     public function __call($func,$args)
  19.     {
  20.              $realFunc=substr($func,1);
  21.              if(method_exists($this,$realFunc))
  22.              {
  23.                  call_user_func_array(array($this,$realFunc),$args);
  24.                  return $this->_vista->renderizar($realFunc);
  25.              }
  26.              throw new Exception(...) // Aqui, yo lanzaria una excepcion.
  27.      }
  28. }

Etiquetas: final, metodo, php, siempre
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 13:58.