Foros del Web » Programando para Internet » PHP »

crear dinamicamente clases

Estas en el tema de crear dinamicamente clases en el foro de PHP en Foros del Web. Hola, estoy armando una clase para dar permisos a usuarios de tener ciertas acciones en el sitio web, para esto lo que intento hacer es ...
  #1 (permalink)  
Antiguo 22/07/2010, 13:38
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
crear dinamicamente clases

Hola,
estoy armando una clase para dar permisos a usuarios de tener ciertas acciones en el sitio web, para esto lo que intento hacer es leer todos los controladores que existen en una carpeta, y después obtener todos los métodos de una clase, para esto estoy usando algo asi:
Código PHP:
class PermisosUsuarios {

    private static 
$instance=null;

    
/**
     * Constructor
     *
     */
    
public function __construct() {

    }

    
/**
     * carga los nombre de los controladores existentes
     * @version 0.1
     * @author Lucas M. Sastre
     * @access public
     * @name cargarControladoresPermisos
     *
     * Modificaciones
     */
    
public function cargarControladoresPermisos($dir) {
        if(
is_dir($dir)) {
        if (
$dh opendir($dir)) {
            while ((
$file readdir($dh)) !== false) {
            if(
$file != "." && $file != ".." && $file != 'smarty' && $file != '.svn' && $file != 'ajax' && $file != 'error404') {
                
$nombres[] = $file;//echo "nombre archivo: $file : tipo archivo: " . filetype($dir . $file) . "\n";
            
}
            }
            
closedir($dh);
        }
        }

        return 
$nombres;

    }

    
/**
     * carga los nombre de los metodos de un controlador existentes
     * @version 0.1
     * @author Lucas M. Sastre
     * @access public
     * @name cargarMetodosControladoresPermisos
     *
     * Modificaciones
     */
    
public function cargarMetodosControladoresPermisos($ruta,$class) {
        
$clase $ruta.$class."/".strtolower($class)."Controller.php";
        
$class strtolower($class)."Controller";

        if(
file_exists($ruta)){
        if(
class_exists($class)) {
            
$class_methods get_class_methods($class);
        }
        else {
            
$class_methods get_class_methods(new $class());
        }
        }       

        return 
$class_methods;
    }


    
/**
     * Creo el patron Singleton
     *
     * @return instance
     */
    
public static function singleton() {
        if( 
self::$instance == null ) {
        
self::$instance = new self();
        }

        return 
self::$instance;
    }
    } 
y después en controlador lo invoco así:
Código PHP:
public function index() {
        echo 
$this->Config->get('root').$this->Config->get('adminControllerFolder')."<br/>";
        echo
"Carpetas <pre>";
        
print_r($this->PermisosUsuarios->cargarControladoresPermisos($this->Config->get('root').$this->Config->get('adminControllerFolder')));
        echo
"</pre>";

        
$controladores $this->PermisosUsuarios->cargarControladoresPermisos($this->Config->get('root').$this->Config->get('adminControllerFolder'));
        echo
"Controladores<pre>";
        
print_r($controladores);
        echo
"</pre>";
        echo
"Metodos<pre>";
        
print_r($this->PermisosUsuarios->cargarMetodosControladoresPermisos($this->Config->get('root').$this->Config->get('adminControllerFolder'),'configuracion'));
        echo
"</pre>";
        for(
$i=0;$i<count($controladores);$i++){
        
//echo $controladores[$i]."<br/>";
        
$nombre[]=$controladores[$i];
        
$metodos $this->PermisosUsuarios->cargarMetodosControladoresPermisos($this->Config->get('root').$this->Config->get('adminControllerFolder'),$controladores[$i]);
        for(
$j=0;$j<count($metodos);$j++){
            
//echo $metodos[$j]."<br/>";
            
$nombre[$controladores[$i]][]= $metodos[$j];
        }
        }
        echo
"arreglo <pre>";
        
print_r($nombre);
        echo
"</pre>";
        exit(); 
y en mi controlador base tengo:
Código PHP:
abstract class Controller {
protected 
$PermisosUsuarios;
public function 
__construct() {
 
//creo la instancia de los permisos
        
$this->PermisosUsuarios = new PermisosUsuarios();
}

Bien el problema lo tengo cuando quiero acceder a los métodos de la una clase, me tira el siguiente error:
Cita:
Fatal error: Class 'configuracionController' not found in C:\xampp\htdocs\punk_dev\core\clases\class.permiso s.php on line 68
la linea 68 dice:
Código PHP:
$class_methods get_class_methods(new $class()); 
La clase configuracionController es la primer clase que se encuentra en el directorio que estoy buscando, este error salta cuando llamo al método cargarMetodosControladoresPermisos() desde cualquier controlador distinto a configuracionController, si lo pruebo desde este controlador funciona bien.
Pasando en limpio:
Como puedo hacer para obtener todos los argumentos de todas las clases que esten en distintos directorios dentro de otro (admin/controladores/configuracion/, admin/controladores/usuarios/, etc?
La idea es poder guardar todo en un arreglo y que pueda mostrarlo asi:
Usuario
crearUsuario
editarUsuario
borrarUsuario
Items
crearItem
listarItem
listarItemPorCliente

Desde ya muchas gracias.
  #2 (permalink)  
Antiguo 22/07/2010, 13:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: crear dinamicamente clases

Lo que pasa es que al declarar el file_exists te falta incluir la clase usando include_once para poderla pasar por el parser de PHP y que esta este "visible" y poder ver sus métodos.

Saludos.
  #3 (permalink)  
Antiguo 22/07/2010, 21:26
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: crear dinamicamente clases

Exacto estimado GatorV, faltaba agregar el include_once jejej, muchas gracias

Etiquetas: clases, dinamicamente
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:27.