O framework PHP por trás do SitioYa

Documentação do Koshkil

Primeiros passos

Introdução

Koshkil é um framework PHP leve, no estilo MVC, sobre o qual o SitioYa é construído. Ele resolve o que quase todo site precisa (roteamento, controladores, templates, acesso ao banco de dados, usuários e permissões, traduções, API e cache) com pouquíssima configuração e sem impor uma estrutura rígida.

O que inclui

Área O que resolve Onde fica
Roteamento Converte a URL em controlador, ação e argumentos. Regras de reescrita por expressão regular. core/http/Route.php, core/http/RewriteManager.php
Controladores Ciclo de vida com hooks, controle de acesso, respostas HTML, JSON ou JavaScript. core/web/, src/Controllers/
Views Templates Smarty 4 organizados em temas, widgets reutilizáveis e plugins de Smarty próprios. core/web/View.php, webroot/themes/
Modelos Active record com construtor de consultas encadeável, relações, eventos e comportamentos. O esquema é criado e atualizado automaticamente. core/db/
Segurança Sessões (arquivo ou banco de dados), usuários, papéis e regras com permissões por bits. core/http/Session.php, core/models/
Internacionalização Traduções em JSON por idioma e domínio, helpers __() e tags {t}. core/tools/I18n.php, config/locales/
API REST Um único ponto de entrada, ações classe.método, chamadas em lote e uso interno sem HTTP. core/web/Rest/, src/api/
Cache Motores de arquivo, Redis e nulo, configurados por domínio de uso. core/cache/
Plugins Módulos autocontidos com seus próprios controladores, modelos, templates, permissões e menu. plugins/

Conceitos principais

  • Convenção antes de configuração. A URL /productos/ver/15 executa ProductosController::ver(15) e exibe o template productos/ver.tpl sem registrar nada.
  • Configuração por domínio. O mesmo código atende vários sites. Cada domínio pode sobrescrever qualquer arquivo de config/ a partir de config/domains/<domínio>/, inclusive o tema.
  • Tudo passa por Koshkil. A classe estática Koshkil carrega arquivos (Koshkil::Uses()) e modelos (Koshkil::UsesModel()), monta links (Koshkil::getLink()) e guarda o controlador atual (Koshkil::$controller).
  • Esquema declarativo. Cada modelo descreve sua tabela em código. Com Database.AutoUpdateSchema ativo, o Koshkil cria a tabela e a mantém sincronizada com essa definição (veja Modelos).

Uma olhada rápida

Um controlador e seu template:

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

class SaludoController extends SuperController {

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

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

Um modelo com sua tabela:

<?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();

Como ler esta documentação

  1. Comece por Instalação e Estrutura do projeto.
  2. Ciclo de vida de uma requisição explica como todas as peças se encaixam.
  3. Depois, cada capítulo pode ser lido separadamente, conforme a necessidade.

Convenções

Os caminhos de arquivo são relativos à raiz do projeto. <tema> é o valor de Templates.Theme e <domínio> é o nome do servidor ($_SERVER['SERVER_NAME']). O código do SitioYa usa nomes em espanhol (usuarios, productos…); os exemplos os mantêm para coincidir com o código real.