Introducción Concepto de Kurmix
Kurmix es un Framework donde las funcionalidades y la estructura son muy similares de un lenguaje de programación a otro. Kurmix permite crear aplicaciones web de forma rápida y sencilla, es muy fácil aprender a usarlo.
Se pueden realizar aplicaciones web monolíticas con la versión MVC y también microservicios con la versión Back.
Inicio rápido Aprendiendo fácil y rápido
Aprender kurmix es bastante sencillo
Instalación
Aprender kurmix es bastante sencillo
Hola Mundo
Una vez instalado, podemos ejecutar la url: http://localhost:80/kurmix/
Si abrimos el fichero que se ubica en app/controller/IndexController.ext (donde .ext es la extención dependiendo del lenguaje.) observamos el codigo:
class IndexController extends Controller
{
function index(){
$this->write('Hola Mundo..!');
}
}
from _libs.kurmix.Controller import *
class IndexController(Controller):
def index(this):
this.write("Hola mundo..! ")
import kurmix.Controller;
public class IndexController extends Controller
{
public void index(){
this.write("Hola Mundo..!");
}
}
Nuestro simple y facil "Hola mundo" lo ha generado la accion index desde el controlador index, entenderemos el funcionamiento siguiendo el manual.
Ejercicio operaciones
Vamos a resolver el siguiente ejercicio: Se necesita crear una acción donde se envie dos numeros y nos retorne el la suma de estos.
Solución: Creamos un nuevo controlador al que llamamos OperadorController y dentro de ella creamos la acción suma.
Como podemos notar, desde la url llamamos al controlador operador y la acción suma y además como parámetros 8 y 4 y este realiza la suma y retorna la suma de ambos.
En la siguiente sección vamos a entender como funciona las url en kurmix.
Enrutamiento URLs del proyecto
Las urls de kurmix tienen la siguiente nomenclatura:
http://localhost:8081/ kurmix ?k= operaciones/ sumar/ 12/ 4
Como regla general se tiene:
http://dominio:puerto/proyecto/?k=controlador/accion/parametro1/parametro2/.../parametroN
En el ejemplo del 'Hola Mundo' notamos que la url invocada http://localhost:8081/kurmix no llama a una acción ni a un controlador, esto es por que kurmix considera que si no se envia el controlador y/o la acción, se esta llamando al index.
Se puede considera las sigueintes equivalencias:
http://localhost:8081/kurmix equivale a http://localhost:8081/kurmix/?k=index/index
http://localhost:8081/kurmix/?k=operador equivale a http://localhost:8081/kurmix/?k=operador/index
Kurmix permite el uso de reescrituras de url, donde se puede ocultar la variable ?k= quedando de la forma:
http://localhost:8081/kurmix/operaciones/sumar/12/4
Estructura Estructura de ficheros del proyecto
Las urls de kurmix siempre tendran la siguiente nomenclatura:
libs/
└── kurmix/
└── util/
├── index.html
app/
└── _config/
└── controller/
└── model/
└── view/
│ ├── _templates/
│ ├── _partials/
│ ├── index/
├── apps/
├── docs/
Controlador El controlador y las acciones
El controlador es la capa que contiene las acciones donde se ejecutarán las peticiones, estos deben heredar de la clase Controller y se deben crear dentro del paquete/carpeta controller.
La acción
La acción es un método de la clase controlador, es decir es la función que se ejecuta al invocarlo desde la url, en un microservicio estas vienen a ser los endpoints.
Preferentemente se deben utilizar palabras minúsculas para el nombre de la acción, existen palabra reservadas que no pueden ser utilizadas, y son las siguientes:
| before | after | write | headers |
| get | set | body | model |
| view | template |
* Estas dos últimas (view y template) son reservadas solo para la version MVC.
Dependiento del lenguaje a usar, Kurmix permite uso de decoradores o pseudodecoradores para definir el tipo de metodo a usar.
Como se muestra en la linea 3, al llamar a la acción solo permitira el método GET, Si se intenta llamar con otro método, como en el ejemplo con POST, notamos que nos retorna un error.
Si no se utilizar el decorador se podra invocar la acción con cualquier método.
Los decoradores que se pueden utilizar son los siguientes:
| Get | Post | Put | Patch | Delete |
Estos decoradores tambien permiten el renombrar las acciones con un alias, con la siguiente notación:
Se debe tener en cuenta que no se debe usar caracteres especiales, tampoco espacios, ni los caracteres '/' o '#'.
Parámetros de una acción
Como se vio en el ejercio de operaciones, los parámetros enviados en la url lo recibe directamente la acción.
Kurmix interpreata que los datos siguientes al controlador y a la acción son parámetros, para la url ?k=operador/suma/12/4 corresponden a las variables de la accion a = 12 y b = 4.
Vamos a crear una nueva acción en controlador operador llamado saludo, donde se ingrese el nombre de una persona y retorne un saludo.
El método body
Algunas veces es necesario enviar mayor cantidad de información desde un cuerpo, esta forma es muy utilizada en el uso de fomularios y apis. Para recuperar la informacion del body, se debe utilizar la funcion body()
Observe que en la linea 4 se invoca al metodo $this->body() quien retorna la información en un objeto o array dependiendo del lenguaje utilizado.
El método write
Anteriormente ya utilizamos la función write() para imprimir textos, pero esta función tiene otros usos.
Con el uso de write, tambien se puede imprimir código html, por ejemplo:
Para el usos de apis, es usual imprimir json, write permite la conversion enviando un objeto o array dependiendo del lenguaje utilizado.
Tener en cuenta que la respuesta es de tipo application/json.
Write tambien permite el usos de status de respuesta, muy util para uso de apis. Por ejemplo:
Si no se envia el parametro, por defecto se toma el 200 Ok.
También se pueden enviar headers en la respuesta. Por ejemplo:
Note que la variable headers es un array, es decir se pueden enviar mas de un header en el response.
El método headers
En la sección anterior vimos cmo escribir un header, en esta sección veremos como leer los header de los request. El uso de header pueder ser muy util a la hora de utilizar token de autorización.
Para poder obtener el valor de un header, existe el metodo header() donde al enviar el nombre del header este retorna el valor de este.
El método header() tiene una sobrecarga, donde si no se le envia ningun parametro, este retorna un arreglo de los headers.
Los métodos before y after
Se tiene reservado dos acciones para ser invocadas antes y despues de ejecutar un acción, el método before() se ejecuta antes de que se ejecute la acción dentro de un controlador. Ejemplo:
El método after() se ejecuta despúes de que se ejecute la acción. Ejemplo:
Ambos métodos no soportan parámetros.
Estos metodos son utiles por ejemplo para validar las credenciales de acceso antes de ejecutar una accion, o dejar un registro despues de ejecutar una accion.
Los métodos get set
Los método get() y set() permiten disponibilizar informacion dentro de un controlador, como tambien con el modelo y para el caso de MVC para la vista.
Si bien estos métodos son muy utiles en la capa de la vista, pueden usarse dentro desde el mismo controlador, por ejemplo:
Algunos datos del request se encuntran disponibles desde el método get(), por ejemplo:
Los datos disponibles son los siguientes:
| Controller | Nombre del controlador |
| _action | Nombre de la acción |
| _alias | Nombre |
| _url | La url del request |
Los métodos template y view
Los métodos template() y view() estan solo disponibles en la verison MVC de Kurmix. Revisar su uso en la seccion Vista de este manual.
El método model
El metodo model() obtiene un objeto instanciado de la clase heredada de Model, esta sección se entenderá de mejor forma en la seccion Model de este manual pero se debe tener en cuenta que existe el metodo en el controlador para invocar al modelo.
El ejemplo muestra que se utiliza el metodo model("Personas") para obtener una instancia de esta clase Personas que hereda de la clase Model, para luego invocar al metodo listar() de esta objeto.
Modelo El modelo y su orm
El modelo es la capa que interactua con la base de datos, se deben crear dentro del paquete/carpeta model y deben heredar de la clase Model.
Se sugiere el formato camel case para el nombre de los métodos del modelo, tener en cuenta que no se pueden usar los siguientes nombres:
| query | paginate | save |
| delete | find | findById |
Para conectarse a la base de datos, es necesario realizar la configuracion de la credenciales. En el paquete/carpeta config se tiene la clase Config donde se debe registrar las credenciales de la base de datos.
Kurmix entiende que por defecto es una base de datos MySql o MariaDB, en caso de que se quiera utilizar otras BDs se puede utilizar el atributo CONNECTION donde recibe una cadena de conexion, ejemplo:
Esta notacion permite seleccionar el tipo de BD, y ademas de agregar otras configuraciones en la cadena, por ejemplo estableser el charset: mysql:host=HOST;port=PORT;dbname=DATABASE;charset=utf8'
El método query
El método query() se conecta a la base de datos y ejecuta una query SQL. Suponiendo que tenemos la siguiente tabla personas:
| personas | |||
|---|---|---|---|
| id | nombre | edad | |
| 1 | Luis | 32 | |
| 2 | Maria | 27 | |
| 3 | Jorge | 17 | |
Vamos a invocar el método query() a fin de listar la informacion de la tabla.
class OperadorController extends Controller
{
function personas(){
$obj = $this->model('Personas');
$personas = $obj->listar();
$this->write($personas);
}
}
Como podemos notar, kurmix ha mapeado los campos de la tabla y lo ha convertido en un objeto o arreglo.
Si quisieramos solo mostrar los nombres:
class Personas extends Model
{
function listar(){
return $this->query('SELECT nombre FROM personas');
}
}
query() detecta el resultado y lo convierte en un objeto.
Algo util es renombrar los campos del resultado, por ejemplo, queremos que en vez de 'nombre' el campo sea 'name', entonces la query quedaria de la siguiente forma: SELECT nombre name FROM personas prueba y observa el resultado.
Ahora, vamos a listar las personas que tengan menos de 18 años.
class Personas extends Model
{
function listar(){
return $this->query('SELECT * FROM personas WHERE edad < 18');
}
}
Es aceptable para el uso de un dato en duro como el valor '18' en el ejercicio, pero si este seria una variable, se recomienda utilizar la sobrecarga del metodo query() quien acepta un array de parametros. Veamos el siguiente ejemplo:
class Personas extends Model
{
function listar(){
return $this->query('SELECT * FROM personas WHERE edad < ?',[18]);
}
}
Como se puede observar, definimos una varible a recibir en la query con la notacion ? y esta sera reemplazada con el valor 18 enviado desde el array. Es muy recomendable el uso indicado para evitar inyeccion de código sql.
Ahora veamos otro ejemplo, vamos a listar las personas mayores de 18 años y menores de 30 años
Como se puede observar, se tiene dos variables en la query, por tanto se debe enviar 2 valores por el array con el orden correspondinete.
También podemos usar el método query() para uso de otras quieries como UPDATE, INSERT, procedimientos almacenados, etc. Veamos un ejemplo de INSERT.
Como se puede observar, query() retornó el Id Autoincrement del insert en un array, esto ya que el método siempre retornará un array o un null.
El método paginate
Vista El controlador y las acciones
El controlador es la capa que contiene las acciones donde se ejecutarán las peticiones, estos deben heredar de la clase Controller y se deben crear dentro del paquete/carpeta controller.
Los assets
La vista por defecto
xx