El problema es que tengo una aplicación con el diseño Singlenton que funciona mas o menos de la siguiente manera:
Index.php : este Archivo recibe siempre los REQUEST HTTP, POST y GET, Intancia al archivo Main.php eh Instancia a la Funcion Main.
Main.php : este Archivo es el Segundo en ejecutarce luego del Index quie lo llama, este Archivo se encarga de:
1. Hacer require a un archivo config.conpro.php que Carga Constantes de la Aplicación estas Constantes deben poder usarse desde cualquier lugar del codigo luego de que se instancia este archivo.
2. Hacer require a los archivos que Manejaran las Clases de MVC
3. Hacer require a los archivos que Manejaran las Clases de Modulos de la Aplicacion
4. Ejecutar la Funcion Main en donde Se Cita:
A. El Manejador de Sesion
B. El Manejador de REQUEST-HTTP
C. El Manejador de Usuario
D. El Manejador de Contenido
E. El Manejador de Salida de Dato
F. El Manejador de variable
Explico ahora con ejemplos y códigos:
pensando en implementar el spl_autoload_register que es más flexible que el __autoload.
Pero necesito un poco de guía (Ejemplos basados en lo que expongo) ya que no sé si puedo hacer lo que actualmente hago de acuerdo a esta estructura.
Esta estructura se basa en el modelo Singleton con llamadas de archivos individuales para gestionar y organizar la estructura de la aplicación.
Archivos Index.php: Este archivo que utilizo para inicializar algunos parámetros php personalizados y es también el archivo de referencia en todo momento como un archivo utilizado para las solicitudes http. En este archivo también hago la inclusión a la Biblioteca Main.php y también instanciar como una clase y luego llamar a la clase y la funcion:
Ejemplo:
Código PHP :
<?php ini_set('zlib.output_compression', 1); ini_set('session.use_only_cookies', 1); ini_set('session.cookie_httponly', 1); require_once("control/class.Main.php"); date_default_timezone_set(ZONA); $WebAPP = new Class_MAIN(); $WebAPP -> Main(); ?>
Archivos Main.php: en este archivo es el controlador típico y el gestor de acciones con el usuario, Actualmente necesito a los archivos de configuración y los gestores de archivos de otras clases, Como un segundo objetivo, el archivo Main.php es también el que gestiona el Estado de la sesión, administra las solicitudes GET y POST, gestiona la generación de contenido llamando al administrador. Cuando se devuelve por el gestor de contenido, llama al Administrador de vistas para imprimir la pantalla necesaria y finalmente llamar al Administrador de datos para borrar todas las variables utilizadas excepto las de sesión.
Ejemplo:
Código PHP :
<?php class Class_MAIN{ public function __construct(){ require_once ('control/config/config.security.php'); #Require of Security Params require_once ('control/config/config.conpro.php'); #Require of Constant to Use betwen all APP (DB Infos conecction, FTP Connection Etc) require_once ('control/config/config.mail.php'); #Require of Constant to Send Mail (i think implement in conpro) require_once ('control/config/config.model.php'); #Require that Call other Requires as Class Model Layer Generic (DB Manager, Date Manager, Error Manager, FTP Manager) require_once ('control/config/config.viwer.php'); #Require that Call other Requires as Class Model viwer Generic (Form, List, Modals, Process, etc) require_once ('control/config/config.classlibdep.php'); #Require that Call other Requires as Class APP MODULES as sub controlles (Departament Manager Process ) # Inicialisamos las clases que usaremos $this->SESSIONMANAGER = new Class_SessionManager(); #Manager of Sesion Called from : config.model.php $this->HTTPDATAMANAGER = new Class_HTTPDataManager(); #Manager of REQUEST-HTTP (GET, POST) Request. $this->USERMANAGER = new Class_UserManager(); #Manager of User. $this->CONTENTMANAGER = new Class_ContentManager(); #Content Manager. $this->VARMANAGER = new Class_VarManager(); #Manager de Variables } public function __destruct(){ $this->SESSIONMANAGER = new Class_SessionManager(); #Manager of Sesion Called from : config.model.php $this->HTTPDATAMANAGER = new Class_HTTPDataManager(); #Manager of REQUEST-HTTP (GET, POST) Request. $this->USERMANAGER = new Class_UserManager(); #Manager of User. $this->CONTENTMANAGER = new Class_ContentManager(); #Content Manager. $this->VARMANAGER = new Class_VarManager(); #Manager de Variables } public function Main(){ $this -> SESSIONMANAGER -> Ses_Create(); #Check and Create Sesion Web and Cookies $DTACheck = $this -> HTTPDATAMANAGER -> Check_POSTGET(); #Manager Request if exists $USERLoged = $this -> USERMANAGER -> Check_USERLogin(); #Check User is Logged $this -> CONTENTMANAGER -> Gen_Display($USERLoged, $DTACheck); #Call to Manager Content to retrive the data According to the request of the user $this -> VARMANAGER -> ClearVars(); #Cleaner Vars } } ?>
Después de hacer esto, cada archivo de config.model.php y config.viewer.php comienza a estar involucrado, Terminando cada vez más complejo con: config.classloader.php.
** Ejemplo: config.conpro.php (Constantes) **
Código PHP :
<?php if (!defined('CONECTOR_DB')) define('CONECTOR_DB' ,'PDO'); if (!defined('DB_HOST')) define('DB_HOST' ,'localhost'); if (!defined('DB_USERNAME')) define('DB_USERNAME' ,'root'); if (!defined('DB_PASS')) define('DB_PASS' ,''); if (!defined('DB_PRE')) define('DB_PRE' ,'TEST'); if (!defined('DB_N_SEC')) define('DB_N_SEC' ,'USER'); if (!defined('DB_PORT')) define('DB_PORT' ,'3306'); ?>
** Ejemplo: config.model.php (Biblioteca de clases) sí la aplicación incluye un archivo que incluye otros archivos como clase **
Código PHP :
<?php $APP_DIR_EXT =$_SERVER['DOCUMENT_ROOT'] . '/control/classext/'; if (!defined('EXT_PASSWORD_CLASS')) define('EXT_PASSWORD_CLASS' ,'class.ext.password.php' ); #Add advanced encryption. if (!defined('EXT_PHPMAILER_CLASS')) define('EXT_PHPMAILER_CLASS' ,'phpMailer/PHPMailerAutoload.php' ); #Add Mail Sistem to remplace defauld $APP_DIR_CLASSGEN =$_SERVER['DOCUMENT_ROOT'] . '/control/classgeneric/'; if (!defined('SESSIONMANAGER_CLASS')) define('SESSIONMANAGER_CLASS' ,'class.managersession.php' ); #Clase Name Manager Sesion. if (!defined('COOKIESMANAGER_CLASS')) define('COOKIESMANAGER_CLASS' ,'class.managercookies.php' ); #Clase Name Manager Cookies if (!defined('VARMANAGER_CLASS')) define('VARMANAGER_CLASS' ,'class.managervar.php' ); #Clase Name Manager Variables #Require require_once $APP_DIR_EXT . EXT_PASSWORD_CLASS; require_once $APP_DIR_EXT . EXT_PHPMAILER_CLASS; require_once $APP_DIR_CLASSGEN . SESSIONMANAGER_CLASS; require_once $APP_DIR_CLASSGEN . COOKIESMANAGER_CLASS; require_once $APP_DIR_CLASSGEN . VARMANAGER_CLASS; ?>
** Ejemplo: config.viewer.php (Biblioteca de clases) sí la aplicación incluye un archivo que incluye otros archivos como clase **
Código PHP :
<?php $APP_DIR_CLASSMVC =$_SERVER['DOCUMENT_ROOT'] . '/control/classMVC/'; if (!defined('CONTENTMANAGER_CLASS')) define('CONTENTMANAGER_CLASS' ,'class.managercontent.php' ); #Clase Name Manager Content and Permison. if (!defined('MENUMANAGER_CLASS')) define('MENUMANAGER_CLASS' ,'class.managermenu.php' ); #Clase Name Manager Menu and Permison. if (!defined('CRUDMANAGER_CLASS')) define('CRUDMANAGER_CLASS' ,'class.managerCRUD.php' ); #Clase Name Manager Crud and Permison. #Require require_once $APP_DIR_CLASSMVC . CONTENTMANAGER_CLASS; require_once $APP_DIR_CLASSMVC . MENUMANAGER_CLASS; require_once $APP_DIR_CLASSMVC . CRUDMANAGER_CLASS; ?>
** Ejemplo: config.classlibdep.php (Biblioteca de Clases) sí y más hijos de hijos de hijos de Padre (Principal) **
Código PHP :
<?php $APP_PHPCORE_DIR_DEPFORMS =$_SERVER['DOCUMENT_ROOT'] . '/control/core/forms'; $APP_PHPCORE_DIR_DEPPROCESS =$_SERVER['DOCUMENT_ROOT'] . '/control/core/process'; $APP_PHPCORE_DIR_DEPLIST =$_SERVER['DOCUMENT_ROOT'] . '/control/core/list'; $APP_PHPCORE_DIR_DEPMODALS =$_SERVER['DOCUMENT_ROOT'] . '/control/core/modal'; #Form area Files(every one is a Manager that Include Form html files According to the request of the user) if (!defined('FORM_GEN')) define('FORM_GEN' ,'formgen.php'); # Form Generic if (!defined('FORM_SIS')) define('FORM_SIS' ,'formsis.php'); # Form for Sistem Manager #List area Files(every one is a Manager that Include PHP logic file to Used to generate specific lists according to each department According to the request of the user if (!defined('LIST_GENERIC')) define('LIST_GENERIC' ,'listgeneric.php'); if (!defined('LIST_GEN')) define('LIST_GEN' ,'listgen.php'); #Modals html files if (!defined('MODAL_GENERIC')) define('MODAL_GENERIC' ,'AMgeneric.php'); # Modals generic(Manual in Line ) if (!defined('MODAL_GEN')) define('MODAL_GEN' ,'AMgen.php'); # Modals gen(to Guideline this process generic) #Process php Logic(depending on put CRUD button used this manager internal Process logic of php) if (!defined('PROCESS_GEN')) define('PROCESS_GEN' ,'processgen.php'); # Procesos del Area de Genericos if (!defined('PROCESS_SIS')) define('PROCESS_SIS' ,'processsis.php'); # Procesos del Area de Sistema #Require require_once $APP_PHPCORE_DIR_DEPFORMS . '/' . FORM_GEN; require_once $APP_PHPCORE_DIR_DEPFORMS . '/' . FORM_SIS; require_once $APP_PHPCORE_DIR_DEPLIST . '/' . LIST_GENERIC; require_once $APP_PHPCORE_DIR_DEPLIST . '/' . LIST_GEN; require_once $APP_PHPCORE_DIR_DEPMODALS . '/' . MODAL_GENERIC; require_once $APP_PHPCORE_DIR_DEPMODALS . '/' . MODAL_GEN; require_once $APP_PHPCORE_DIR_DEPPROCESS . '/' . PROCESS_GEN; require_once $APP_PHPCORE_DIR_DEPPROCESS . '/' . PROCESS_SIS; ?>
Después de que ya he citado todos los archivos y que están involucrados en la aplicación ahora viene la instanciación y la aplicación:
Código :
Class_MAIN Has the function: Main(){} This calls for: $ this -> CONTENTMANAGER -> Gen_Display() This class has a structure that calls other classes: function __construct() { #We call the files that are required for page operation $this -> MENUMANAGER = new Class_MenuManager (); $this -> FORMMANAGER = new Class_FormManager (); $this -> PROCESSMANAGER = new Class_ProcessManager (); $this -> MODALSMANAGER = new Class_ModalManager (); }
Y así es con una estructura de jerarquía de acuerdo a las entradas.
Como se puede ver, utilizo el constructor para llamar a los archivos y clases que usaré en mi aplicación.
También verá la dependencia que existe entre las clases.
Mi pregunta es qué estructura debo seguir migrando a la implementación de spl_autoload_register, y si tienen o pueden ayudar con ejemplos.