O framework PHP por trás do SitioYa

Documentação do Koshkil

Primeiros passos

Configuração

A classe Configure

Toda a configuração vive em um único array em memória, lido e escrito com chaves separadas por pontos.

Configure::read('Templates.Theme');              // 'cgs'
Configure::read('Debug.Level', 0);               // com valor padrão
Configure::check('Google.Recaptcha');            // a chave existe?
Configure::write('Templates.Site.phone', '...'); // cria os níveis que faltam
Configure::consume('flash_message');             // lê e apaga
Configure::delete('scripts');
Configure::merge(['Web' => ['SiteName' => 'X']]); // mesclagem profunda

No Smarty funciona igual: {Configure::read('Web.SiteName')}.

Tip

Configure também guarda dados da requisição atual: a rota (System.Route), os scripts e estilos adicionados (scripts, styles) e as mensagens (flash_message, error_message).

Como os arquivos são carregados

Koshkil::loadConfig() é executado ao incluir core/Koshkil.php. Para cada arquivo da lista, carrega primeiro a versão global de config/ e depois, se existir, a do domínio. Cada arquivo define um array $CONFIG que é mesclado em profundidade com o que já foi carregado, então o domínio só precisa declarar o que muda.

Arquivos carregados em toda requisição, nesta ordem:

  1. config.php
  2. datasources.php
  3. cache.php
  4. extensions.php
  5. sessions.php
  6. rewrite.php
  7. i18n.php

Para cada um, a sobrescrita do domínio é procurada nesta ordem (usa-se a primeira que existir):

Local Exemplo
config/domains/cli/<arquivo> somente se SERVER_NAME estiver vazio (linha de comando)
config/domains/<domínio>/<arquivo> config/domains/meusite.com/config.php
config/domains/<domínio>/<arquivo>.php
config/domains/<domínio>.<arquivo> config/domains/meusite.com.config.php
config/domains/<domínio>.php somente para config.php

Outros arquivos são carregados sob demanda: email.php ao enviar e-mail, google.php pelo SuperController, api.php pelo ApiService. Você pode carregar os seus da mesma forma:

Koshkil::loadConfig(['pagamentos.php']);   // config/pagamentos.php + config/domains/<domínio>/pagamentos.php

Reaproveitar a configuração de outro domínio

Um domínio de desenvolvimento pode partir do de produção incluindo o arquivo dele antes de alterar o necessário:

php <?php require __DIR__ . '/../meusite.com/config.php'; $CONFIG = array_merge($CONFIG, ['Debug' => ['Level' => 2, 'Javascript' => true]]);

Principais chaves

config.php

Chave Uso
System.DefaultController Controlador que responde quando a URL não coincide com nenhum (padrão index).
System.Text.MaxLength Comprimento máximo de textos usado por alguns utilitários.
Templates.Theme Pasta de webroot/themes/ usada pelo site público.
Templates.Menu, Templates.Site Dados lidos pelos widgets e templates de cada tema (menu, dados de contato…).
Web.SiteName Nome do site.
Debug.Level 0 = sem logs; 1 a 3 = logs com mascaramento diferente de dados sensíveis; 6 = registra todo o SQL; 7 = perfila cada modelo.
Debug.Rewrite 5 ou mais registra o processo de reescrita em tmp/logs/rewrite.log.
Debug.Javascript false faz WebElements::addScript() preferir a versão .min.js, se existir.
Debug.Profiler.Enabled Ativa o profiler de tempos (veja Cache, logs e depuração).
Error.Reporting Valor para error_reporting().
Log.MaxSize, Log.KeepHistory, Log.MaxHistory Rotação dos arquivos de log.
Session.UserHandler.Frontend / .Backend Nome da variável de sessão do usuário no site e no painel.

datasources.php

$CONFIG = [
    'Database' => [
        'AutoUpdateSchema' => true,          // sincroniza as tabelas com os modelos
        'master' => [                        // conexão padrão
            'Driver'   => 'MySQLi',          // MySQLi, PostgreSQL, SQLite, SQLServer, Oracle
            'Host'     => 'localhost',
            'Port'     => 3306,              // opcional
            'Charset'  => 'utf8mb4',         // opcional
            'User'     => '...',
            'Password' => '...',
            'Name'     => 'meu_banco',       // no SQLite: caminho do arquivo
        ],
    ],
];

Outros arquivos

Arquivo Conteúdo Mais informações
cache.php Motores e domínios de cache Cache
sessions.php Motor de sessão, nome do cookie, tempos Segurança
rewrite.php System.Web.Rewrite: regras de reescrita Roteamento
i18n.php Idiomas, idioma padrão, detecção Internacionalização
extensions.php Extensions.Chat, Extensions.Ftp, Extensions.Pusher
email.php Email.Smtp e remetente Utilitários
google.php Google.Recaptcha.SiteKey e chave secreta Segurança
api.php Credenciais da API interna do domínio API REST

Credenciais

datasources.php, api.php e email.php guardam senhas em texto puro. config/ fica fora de webroot/, mas não envie esses arquivos dos domínios reais para o repositório.