Serviços
Utilitários
Os utilitários ficam em core/tools/ e core/network/. Quase todos são classes com métodos estáticos incluídas com Koshkil::Uses().
Koshkil::Uses('sys.tools.utils.stringUtils');
echo stringUtils::makeURL('Promoção de Inverno 2026'); // promocao-de-inverno-2026
Strings: stringUtils
| Método | Uso |
|---|---|
makeURL($texto) |
Texto próprio para URL (slug). |
makeExcerpt($texto, $tamanho = 200, $fim = '...') |
Resumo sem cortar palavras. |
makePlainText($texto) / removeTags($html) / strip_tags_attributes($html) |
Limpeza de HTML. |
makeClickableLinks($texto) |
Transforma URLs em links. |
safeName($nome, $caminho = null) |
Nome de arquivo seguro e único. |
isEmail($texto) |
Valida um e-mail. |
countWords($texto), stringOccurrence($agulha, $palheiro) |
Contagens. |
getMonthName($mes, $curto = true) |
Nome do mês em espanhol. |
padString($texto, $preenchimento, $vezes, $lado = 'left') |
Preenchimento. |
number_unformat($numero, $decimais, $milhar, $decimal) |
Converte "1.234,50" em número. |
replace_all($buscar, $substituto, $texto) |
Substituição repetida até não restarem ocorrências. |
Datas: datesUtils
Koshkil::Uses('sys.tools.utils.datesUtils');
datesUtils::formatDateTime('22/09/2026', 'dd/mm/yy', 'yyyy-mm-dd'); // '2026-09-22'
datesUtils::elapsed('2026-09-22 10:00:00'); // tempo decorrido, em espanhol
datesUtils::timeLeft('2026-12-31 23:59:59');
$data = new datesUtils('22/09/2026 10:00:00');
$data = $data->addDays(7)->addHours(2); // cada operação retorna uma data nova
echo $data->format('Y-m-d H:i:s');
$data->dayOfWeek(); $data->month(); $data->year();
Arquivos: fileUtils
| Método | Uso |
|---|---|
mkdir($pasta) / createDirectory($caminho) |
Cria pastas (recursivo). |
deleteFiles($pasta, '*.cache') / removeFolder($caminho) |
Exclusão. |
getTempDir() |
Pasta temporária do projeto. |
processSingleUpload($campo, $registro, $grupo, $tipo, $uso) |
Guarda um upload na galeria, associado a um registro. |
processMultipleUpload($campo, $registro, $grupo) |
Vários uploads. |
uploadedFileIsValid($campo, $requisitos) |
Valida tipo e tamanho. |
getFileIcon($arquivo, $fontawesome = false) |
Ícone conforme a extensão. |
rotateFile($arquivo, $maxHistorico) |
Rotação (usada pelos logs). |
Imagens: imagesUtils
Koshkil::Uses('sys.tools.utils.imagesUtils');
imagesUtils::resizePicture($origem, $destino, 1200, 800); // mantém a proporção
imagesUtils::loadAndLimitDiskSize($caminho, 300 * 1024); // recomprime até ~300 KB
imagesUtils::getRemoteImage($url, $arquivoLocal, 800, 600);
Outros utilitários
| Classe | Métodos principais |
|---|---|
arrayUtils |
deepMerge($a, $b), sanitizeStrings($array), buildQueryForCurl($array) |
numberUtils |
stringToNumber('1M') → 1048576, numberToString($n, $fator) |
encodingUtils |
Conversão UTF-8 / ISO-8859-1 (utf8_encode, utf8_decode) |
htmlUtils |
parseTag($html), getTagParameters($atributos) |
passwordUtils |
createHash($senha, $hashGuardado = null) |
totpUtils |
Códigos de uso único (TOTP) para segundo fator: secretKey(), verifyKey() |
Inflector |
camelize(), deCamelize(), pluralize(), singularize() |
Sanitize |
mask($dados, $opcoes) mascara senhas e cartões (usado pelo log) |
TCollection |
Coleção iterável (veja Modelos) |
emailUtils envolve o PHPMailer e lê a configuração SMTP de config/email.php:
<?php
$CONFIG = [
'Email' => [
'Smtp' => ['host' => 'smtp.meusite.com', 'port' => 587, 'secure' => true, 'username' => '…', 'password' => '…'],
'Options' => [
'Sender' => ['name' => 'Meu site', 'address' => 'nao-responda@meusite.com'],
'useRealAddress' => true, // false: tudo vai para sendTo (útil em desenvolvimento)
'sendTo' => ['name' => 'Testes', 'address' => 'testes@meusite.com'],
],
],
];
Koshkil::Uses('sys.tools.utils.emailUtils');
$mail = new emailUtils();
$mail->sendTextMailByAddress('cliente@correio.com', 'Seu pedido', '<p>Obrigado pela compra!</p>');
$mail->sendTextMailByAddresses(['a@correio.com', 'b@correio.com'], 'Aviso', $html, [$caminhoAnexo]);
Os métodos sendMailByAddress(), sendMailByUser() e sendMailByRules() usam templates guardados no banco (modelo email_template: tmp_nombre, tmp_titulo, tmp_contenido) e substituem [variavel] pelos valores de setVariable(). sendMailByRules('noticias') escreve para todos os usuários que têm essa regra.
Rede
Koshkil::Uses('sys.network.clients.curl');
$http = new curl('https://api.exemplo.com/v1/precos');
$http->setOptions([CURLOPT_TIMEOUT => 10]);
$json = $http->post(['produto' => 15], ['Accept: application/json']);
Koshkil::Uses('sys.network.clients.ftp');
$ftp = new FTPClient('ftp.meusite.com', 'usuario', 'senha', '/public_html');
$ftp->connect();
$ftp->login();
$ftp->put($arquivoLocal, 'imagens/foto.jpg');
$ftp->close();
Extensions.Ftp.PassiveMode (em config/extensions.php) ativa o modo passivo. Os uploads da galeria podem ser replicados por FTP com os dados usr_ftp_* do usuário.