El framework PHP detrás de SitioYa

Documentación de Koshkil

Primeros pasos

Introducción

Koshkil es un framework PHP liviano, de tipo MVC, sobre el que está construido SitioYa. Resuelve lo que casi todo sitio necesita (ruteo, controladores, plantillas, acceso a base de datos, usuarios y permisos, traducciones, API y caché) con muy poca configuración y sin imponer una estructura rígida.

Qué incluye

Área Qué resuelve Dónde está
Ruteo Convierte la URL en controlador, acción y argumentos. Reglas de reescritura por expresión regular. core/http/Route.php, core/http/RewriteManager.php
Controladores Ciclo de vida con hooks, control de acceso, respuestas HTML, JSON o JavaScript. core/web/, src/Controllers/
Vistas Plantillas Smarty 4 organizadas en themes, widgets reutilizables y plugins de Smarty propios. core/web/View.php, webroot/themes/
Modelos Active record con constructor de consultas encadenable, relaciones, eventos y comportamientos. El esquema se crea y actualiza solo. core/db/
Seguridad Sesiones (archivo o base de datos), usuarios, roles y reglas con permisos por bits. core/http/Session.php, core/models/
Internacionalización Traducciones en JSON por idioma y dominio, helpers __() y etiquetas {t}. core/tools/I18n.php, config/locales/
API REST Un único punto de entrada, acciones clase.método, llamadas en lote y uso interno sin HTTP. core/web/Rest/, src/api/
Caché Motores de archivo, Redis y nulo, con configuración por dominio de uso. core/cache/
Plugins Módulos autocontenidos con sus propios controladores, modelos, plantillas, permisos y menú. plugins/

Conceptos clave

  • Convención antes que configuración. La URL /productos/ver/15 ejecuta ProductosController::ver(15) y muestra la plantilla productos/ver.tpl sin registrar nada.
  • Configuración por dominio. Un mismo código atiende varios sitios. Cada dominio puede sobrescribir cualquier archivo de config/ desde config/domains/<dominio>/, incluido el theme.
  • Todo pasa por Koshkil. La clase estática Koshkil carga archivos (Koshkil::Uses()), modelos (Koshkil::UsesModel()), arma enlaces (Koshkil::getLink()) y guarda el controlador en curso (Koshkil::$controller).
  • Esquema declarativo. Cada modelo describe su tabla en código. Con Database.AutoUpdateSchema activo, Koshkil crea la tabla y la mantiene sincronizada con esa definición (ver Modelos).

Un vistazo rápido

Un controlador y su plantilla:

<?php
// src/Controllers/SaludoController.php  ->  /saludo  y  /saludo/hola/Daniel
Koshkil::Uses('com.SuperController');

class SaludoController extends SuperController {

    public function index() {
        $this->set(['mensaje' => 'Bienvenido']);
    }

    public function hola($nombre = 'mundo') {
        $this->set(['nombre' => $nombre]);
    }
}
{* webroot/themes/<theme>/templates/front/saludo/hola.tpl *}
<h1>Hola, {$nombre|escape}</h1>

Un modelo con su tabla:

<?php
// src/Models/productos.php  ->  Koshkil::UsesModel('productos')  ->  TMProductos
class TModelProductos extends TModel {
    protected $tableName = 'tbl_productos';
    public $primaryKeyColumn = 'prd_codigo';
    protected $fillable = ['prd_nombre', 'prd_precio'];

    protected function setupTableStructure() {
        $this->table->id('prd_codigo')
            ->varchar('prd_nombre', 120, false, '')
            ->decimal('prd_precio', 10, 2, false, 0);
    }
}

$baratos = TMProductos::where('prd_precio', '<', 1000)->order('prd_nombre')->get();

Cómo leer esta documentación

  1. Empezá por Instalación y Estructura del proyecto.
  2. Ciclo de vida de una petición explica cómo encajan todas las piezas.
  3. Después, cada capítulo se puede leer por separado según lo que necesites.

Convenciones

Las rutas de archivo son relativas a la raíz del proyecto. <theme> es el valor de Templates.Theme y <dominio> es el nombre del servidor ($_SERVER['SERVER_NAME']).