Como programador, es importante que entienda el flujo del sistema con el que está trabajando, no solo por el hecho de poder alterar algo cuando sea necesario, sino también porque le dará un impulso de confianza al hacerlo..
Hoy, seleccionaremos OpenCart y lo analizaremos para comprender los conceptos básicos del proceso de envío. Comenzaremos con el proceso de envío y, a medida que avancemos, exploraremos los segmentos de código de las diferentes secciones del marco..
Elegiré la última versión de OpenCart para este artículo, pero más o menos el flujo es similar en las versiones anteriores.
En cualquier aplicación basada en la web, el proceso de envío se utiliza para encontrar la asignación entre la URL de solicitud entrante y el módulo correspondiente en el marco. Por supuesto, la implementación varía de un marco a otro, pero el concepto subyacente sigue siendo el mismo. Así que aquí están algunas de las responsabilidades del despachador:
Intentemos entender esto usando un ejemplo simple en OpenCart. Para crear un nuevo usuario desde el front-end, uno debe registrarse en el sitio utilizando http://www.youropencartstore.com/index.php?route=account/register. Resumamos los pasos tomados por OpenCart para renderizar la página solicitada.
Así que esa es una vista de nivel superior de cómo OpenCart atraviesa la URL solicitada y devuelve la respuesta. En la siguiente sección, profundizaremos y veremos cómo lo hace exactamente..
Sigue adelante y abre el index.php
Archivo en la raíz del documento de OpenCart. Suceden muchas cosas en ese archivo, pero no se sienta abrumado, ya que la mayoría es solo la configuración de los objetos utilizados en todo el marco..
Enseguida tiremos el fragmento de nuestro interés de ese archivo.
// Front Controller $ controller = new Front ($ registry); // Modo de mantenimiento $ controller-> addPreAction (nueva acción ('common / maintenance')); // $ controller-> addPreAction de la URL de SEO (nueva Acción ('common / seo_url'));
Al igual que con la mayoría de los otros marcos, OpenCart también se basa en el patrón del controlador frontal para que haya un punto de entrada común para todas las solicitudes en la aplicación.
Primero, estamos creando una instancia del controlador frontal y asignándola a la $ controlador
variable. Inmediatamente al lado de eso, estamos llamando al addPreAction
Método para añadir un par de acciones..
Ahora, eso trae otro tema en la mesa: ¿qué es una "pre-acción"? En términos simples, una acción previa es una acción que se ejecutará antes de la acción solicitada en cualquier página. Por ejemplo, cuando el usuario hace clic en cualquier página, desea verificar si el sitio está en modo de mantenimiento o no antes de que se devuelva la respuesta real. En ese caso, podría usar una acción previa para que el usuario sea redirigido a la página de mantenimiento si está en.
Además, estamos agregando comun / seo_url
como una acción previa también, ya que en el caso de un sitio habilitado para SEO queremos obtener las variables de ruta correspondientes antes de que comience el despacho real.
Vamos a pasar al siguiente fragmento importante.
// Router if (isset ($ request-> get ['route'])) $ action = new Action ($ request-> get ['route']); else $ action = new Action ('common / home');
Verifica la presencia de la variable de cadena de consulta de "ruta", y si está allí, crearemos una instancia de Acción
clase pasando el valor actual de "ruta" como un argumento constructor. Si no está presente, haremos lo mismo con la ruta de la página de inicio URI-común / hogar
.
Con nuestro $ acción
variable establecida con el valor adecuado, pasemos al siguiente fragmento.
// Dispatch $ controller-> dispatch ($ action, new Action ('error / not_found'));
Finalmente, estamos llamando al envío
Método de la clase de controlador frontal. Seguir adelante y abrir sistema / motor / front.php
y encuentra el siguiente fragmento.
despacho de función pública ($ acción, $ error) $ esto-> error = $ error; foreach ($ this-> pre_action as $ pre_action) $ result = $ this-> execute ($ pre_action); si ($ resultado) $ acción = $ resultado; descanso; while ($ action) $ action = $ this-> execute ($ action);
¡Este es el método donde toda la magia sucede! Primero, ejecuta todas las "preAcciones" como se discutió anteriormente. Además, en el bucle while intentará ejecutar nuestro actual $ acción
, pasado como un argumento de la ejecutar
método.
Sigamos la definición de la ejecutar
método en el mismo archivo.
función privada ejecutar ($ acción) $ resultado = $ acción-> ejecutar ($ esto-> registro); if (is_object ($ resultado)) $ acción = $ resultado; elseif ($ result === false) $ action = $ this-> error; $ this-> error = "; else $ action = false; return $ action;
En la primera línea, la ejecutar
método de la Acción
Se llama clase. No lo confundas con el ejecutar
Método de la clase de controlador frontal. Abre el archivo sistema / motor / accion.php
Y aquí está.
public function execute ($ registry) // Detenga cualquier método mágico que se llame si (substr ($ this-> method, 0, 2) == '__') return false; if (is_file ($ this-> file)) include_once ($ this-> file); $ class = $ this-> class; $ controller = new $ class ($ registry); if (es_callable (array ($ controller, $ this-> method))) return call_user_func (array ($ controller, $ this-> method), $ this-> args); else devolver falso; else return false;
Lo importante a tener en cuenta aquí es que la Acción
La clase ya configura las variables requeridas en el propio constructor cuando se crea una instancia del objeto de acción en index.php
. Establece la expediente
, clase
y método
propiedades, que serán utilizadas en el ejecutar
método. Para mantener las cosas menos complicadas, solo discutiremos la ejecutar
método, aunque le recomendaría que vaya a través del constructor de la Acción
clase.
De vuelta a nuestro ejecutar
método de la Acción
clase, comprueba la presencia del archivo ($ this-> file
) asociado a la ruta actual. Si todo está bien, incluye ese archivo y llama al método correspondiente ($ este-> método
) de esa clase de controlador usando el call_user_func
Funciona y devuelve la respuesta..
Si el archivo asociado no está disponible, regresará falso
. Ahora, volvamos al fragmento de la ejecutar
Método de la clase de controlador frontal. Se paciente, ya casi llegamos!
… $ Result = $ action-> execute ($ this-> registry); if (is_object ($ resultado)) $ acción = $ resultado; elseif ($ result === false) $ action = $ this-> error; $ this-> error = "; else $ action = false; return $ action;…
Una vez que el método de ejecución de la Acción
La clase completa el proceso, devuelve el resultado y se asigna a la $ resultado
variable. Ahora, hay tres posibilidades diferentes con el valor almacenado en $ resultado
. Examinemos cada uno.
Si todo salió bien, tendremos salida HTML en el $ resultado
variable, por lo que la $ acción
variable se establece en falso
y el proceso termina. Es el último caso más.
Recordemos que volvimos falso
si el archivo controlador correspondiente no se encontró en el ejecutar
método de la Acción
clase. En ese caso, el $ acción
la variable se establecerá en $ esto-> error
(error no encontrado Acción
), y "página no encontrada" se mostrará al usuario.
Y por último, si encontramos que el $ resultado
es un objeto en sí mismo, lo pondremos a la $ acción
variable. Sí, eso es raro: ¿por qué demonios el método del controlador devolvería otro? Acción
objeto, cuando se supone que debe devolver el resultado HTML para la página solicitada? Pero esa es solo una de las formas en que el controlador redirige a los usuarios a otra URL..
Abramos rápidamente el catálogo / controlador / common / maintenance.php
Archivo y verlo en acción. En el índice
método, devuelve el Acción
objetar si ciertas condiciones son ciertas.
... if (($ route! = 'Payment' && $ route! = 'Api') &&! $ This-> user-> isLogged ()) return new Action ('common / maintenance / info'); …
Así que, como puedes ver, devuelve el Acción
objeto para redirigir al usuario a la común / mantenimiento / información
URL Por supuesto, hay un código en el envío
Método de la clase de controlador frontal para manejar este comportamiento. Recordar el fragmento de ese método: prometo que es el último fragmento de este tutorial.
... while ($ action) $ action = $ this-> execute ($ action); …
Así que es un bucle while, y se ejecuta hasta que encuentra el $ acción
variable establecida en falso
! Más específicamente, finalizará el ciclo cuando tengamos una salida útil para nuestro usuario.
Así que ese es el final del viaje. Espero que no fuera tan complicado como parecía a primera vista..
Hoy, hemos pasado por un aspecto importante del marco OpenCart: el proceso de envío. Entendimos los conceptos básicos de envío y pasamos por el flujo completo para entender cómo funciona.
Si está buscando herramientas adicionales de OpenCart, utilidades, extensiones, etc., que pueda aprovechar en sus propios proyectos o para su propia educación, no se olvide de ver lo que tenemos disponible en el mercado..
Para cualquier consulta, no dudes en dejar tus comentarios. Además, Twitter es otra opción para contactarme y respondo rápidamente..