set('AUTOLOAD', implode(';', [ $root . '/app/Controllers/', $root . '/app/Models/', $root . '/app/Services/', ])); $f3->set('UI', $root . '/app/Views/'); $f3->set('TEMP', $root . '/tmp/'); $f3->set('LOGS', $root . '/logs/'); $f3->set('paths.db', $root . '/db/app.sqlite'); $f3->set('paths.media_dir', $root . '/public/uploads/media'); $f3->set('paths.media_base', '/uploads/media'); $f3->config($root . '/app/config.ini'); if (is_file($root . '/config.local.ini')) { $f3->config($root . '/config.local.ini'); } $f3->set('TZ', app_timezone((string) $f3->get('app.timezone'))); $f3->set('DEBUG', $f3->get('app.env') === 'prod' ? 0 : 3); $uploadsDir = $root . '/' . trim((string) $f3->get('UPLOADS'), '/'); $f3->set('UPLOADS', $uploadsDir . '/'); foreach ([(string) $f3->get('TEMP'), (string) $f3->get('LOGS'), dirname((string) $f3->get('paths.db')), (string) $f3->get('paths.media_dir'), $uploadsDir] as $dir) { app_ensure_dir($dir); } ini_set('log_errors', '1'); ini_set('error_log', rtrim((string) $f3->get('LOGS'), '/\\') . '/php-error.log'); ini_set('display_errors', $f3->get('app.env') === 'prod' ? '0' : '1'); error_reporting(E_ALL); $db = new DB\SQL('sqlite:' . $f3->get('paths.db')); $db->exec('PRAGMA foreign_keys = ON'); $f3->set('DB', $db); session_name((string) $f3->get('app.session_name')); $f3->set('JAR', [ 'expire' => 0, 'path' => '/', 'secure' => app_request_is_secure(), 'httponly' => true, 'samesite' => 'Lax', ]); new Session(); Template::instance()->filter('date_fr', 'app_date_fr'); if ($f3->get('app.env') === 'prod') { $f3->set('ONERROR', function (Base $f3): void { $code = max(1, (int) ($f3->get('ERROR.code') ?: 500)); $meta = app_error_meta($code); $f3->status($code); $f3->expire(0); $f3->mset([ 'errorCode' => $code, 'errorTitle' => $meta['title'], 'errorMessage' => $meta['message'], ]); echo Template::instance()->render('errors/error.html'); }); } return $f3;