XBackBone/bootstrap/app.php

153 lines
5.7 KiB
PHP
Raw Normal View History

2018-04-28 12:20:07 +00:00
<?php
use App\Database\DB;
2018-11-19 11:19:47 +00:00
use App\Web\Lang;
2018-11-11 16:02:50 +00:00
use App\Web\Session;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Logger;
use Slim\App;
use Slim\Container;
2018-04-28 12:20:07 +00:00
if (!file_exists('config.php') && is_dir('install/')) {
header('Location: ./install/');
exit();
} else if (!file_exists('config.php') && !is_dir('install/')) {
exit('Cannot find the config file.');
}
2018-10-13 16:25:48 +00:00
// Load the config
2018-04-28 12:20:07 +00:00
$config = array_replace_recursive([
'app_name' => 'XBackBone',
'base_url' => isset($_SERVER['HTTPS']) ? 'https://' . $_SERVER['HTTP_HOST'] : 'http://' . $_SERVER['HTTP_HOST'],
'storage_dir' => 'storage',
2018-11-11 16:02:50 +00:00
'displayErrorDetails' => false,
'maintenance' => false,
2018-04-28 12:20:07 +00:00
'db' => [
'connection' => 'sqlite',
2019-02-10 12:48:20 +00:00
'dsn' => BASE_DIR . 'resources/database/xbackbone.db',
2018-04-28 12:20:07 +00:00
'username' => null,
'password' => null,
],
2019-02-10 12:48:20 +00:00
], require BASE_DIR . 'config.php');
2018-04-28 12:20:07 +00:00
2018-11-17 20:54:05 +00:00
if (!$config['displayErrorDetails']) {
2019-02-10 12:48:20 +00:00
$config['routerCacheFile'] = BASE_DIR . 'resources/cache/routes.cache.php';
2018-11-17 20:54:05 +00:00
}
2018-11-11 16:02:50 +00:00
$container = new Container(['settings' => $config]);
$container['config'] = function ($container) use ($config) {
return $config;
};
2018-11-11 16:02:50 +00:00
$container['logger'] = function ($container) {
$logger = new Logger('app');
2019-02-10 12:48:20 +00:00
$streamHandler = new RotatingFileHandler(BASE_DIR . 'logs/log.txt', 10, Logger::DEBUG);
2018-11-11 16:02:50 +00:00
$streamHandler->setFormatter(new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n", "Y-m-d H:i:s", true));
$logger->pushHandler($streamHandler);
return $logger;
};
2019-01-10 22:22:19 +00:00
$container['session'] = function ($container) {
2019-02-10 12:48:20 +00:00
return new Session('xbackbone_session', BASE_DIR . 'resources/sessions');
2019-01-10 22:22:19 +00:00
};
2018-04-28 12:20:07 +00:00
2018-11-11 16:02:50 +00:00
$container['database'] = function ($container) use (&$config) {
2019-02-10 12:48:20 +00:00
$dsn = $config['db']['connection'] === 'sqlite' ? BASE_DIR . $config['db']['dsn'] : $config['db']['dsn'];
2019-01-10 22:22:19 +00:00
return new DB($config['db']['connection'] . ':' . $dsn, $config['db']['username'], $config['db']['password']);
2018-11-11 16:02:50 +00:00
};
2019-01-10 22:22:19 +00:00
$container['lang'] = function ($container) {
2019-02-10 12:48:20 +00:00
return Lang::build(Lang::recognize(), BASE_DIR . 'resources/lang/');
2019-01-10 22:22:19 +00:00
};
2018-11-19 11:19:47 +00:00
2018-11-11 16:02:50 +00:00
$container['view'] = function ($container) use (&$config) {
2019-02-10 12:48:20 +00:00
$view = new \Slim\Views\Twig(BASE_DIR . 'resources/templates', [
'cache' => BASE_DIR . 'resources/cache',
2018-11-11 16:02:50 +00:00
'autoescape' => 'html',
'debug' => $config['displayErrorDetails'],
'auto_reload' => $config['displayErrorDetails'],
]);
// Instantiate and add Slim specific extension
$router = $container->get('router');
$uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER));
$view->addExtension(new Slim\Views\TwigExtension($router, $uri));
$view->getEnvironment()->addGlobal('config', $config);
$view->getEnvironment()->addGlobal('request', $container->get('request'));
2019-01-10 22:22:19 +00:00
$view->getEnvironment()->addGlobal('alerts', $container->get('session')->getAlert());
$view->getEnvironment()->addGlobal('session', $container->get('session')->all());
$view->getEnvironment()->addGlobal('current_lang', $container->get('lang')->getLang());
2018-11-11 16:02:50 +00:00
$view->getEnvironment()->addGlobal('PLATFORM_VERSION', PLATFORM_VERSION);
2018-11-19 18:04:43 +00:00
$view->getEnvironment()->addFunction(new Twig_Function('route', 'route'));
$view->getEnvironment()->addFunction(new Twig_Function('lang', 'lang'));
$view->getEnvironment()->addFunction(new Twig_Function('urlFor', 'urlFor'));
$view->getEnvironment()->addFunction(new Twig_Function('mime2font', 'mime2font'));
2019-01-22 16:39:57 +00:00
$view->getEnvironment()->addFunction(new Twig_Function('queryParams', 'queryParams'));
2018-11-11 16:02:50 +00:00
return $view;
};
2019-02-10 12:48:20 +00:00
$container['phpErrorHandler'] = function ($container) {
return function (\Slim\Http\Request $request, \Slim\Http\Response $response, \Throwable $error) use (&$container) {
$container->logger->critical('Fatal runtime error during app execution', [$error, $error->getTraceAsString()]);
return $container->view->render($response->withStatus(500), 'errors/500.twig', ['exception' => $error]);
};
};
2018-11-11 16:02:50 +00:00
$container['errorHandler'] = function ($container) {
2019-02-10 12:48:20 +00:00
return function (\Slim\Http\Request $request, \Slim\Http\Response $response, \Exception $exception) use (&$container) {
2018-11-11 16:02:50 +00:00
if ($exception instanceof \App\Exceptions\MaintenanceException) {
return $container->view->render($response->withStatus(503), 'errors/maintenance.twig');
}
2018-11-11 16:02:50 +00:00
if ($exception instanceof \App\Exceptions\UnauthorizedException) {
return $container->view->render($response->withStatus(403), 'errors/403.twig');
}
2019-02-10 12:48:20 +00:00
$container->logger->critical('Fatal exception during app execution', [$exception, $exception->getTraceAsString()]);
2018-11-11 16:02:50 +00:00
return $container->view->render($response->withStatus(500), 'errors/500.twig', ['exception' => $exception]);
};
};
2018-11-11 18:18:27 +00:00
2019-02-10 12:48:20 +00:00
$container['notAllowedHandler'] = function ($container) {
return function (\Slim\Http\Request $request, \Slim\Http\Response $response, $methods) use (&$container) {
return $container->view->render($response->withStatus(405)->withHeader('Allow', implode(', ', $methods)), 'errors/405.twig');
};
};
2018-11-11 16:02:50 +00:00
$container['notFoundHandler'] = function ($container) {
return function (\Slim\Http\Request $request, \Slim\Http\Response $response) use (&$container) {
$response->withStatus(404)->withHeader('Content-Type', 'text/html');
return $container->view->render($response, 'errors/404.twig');
};
};
$app = new App($container);
2018-04-28 12:20:07 +00:00
// Permanently redirect paths with a trailing slash to their non-trailing counterpart
$app->add(function (\Slim\Http\Request $request, \Slim\Http\Response $response, callable $next) {
$uri = $request->getUri();
$path = $uri->getPath();
if ($path !== '/' && substr($path, -1) === '/') {
$uri = $uri->withPath(substr($path, 0, -1));
if ($request->getMethod() === 'GET') {
return $response->withRedirect((string)$uri, 301);
} else {
return $next($request->withUri($uri), $response);
}
}
return $next($request, $response);
});
2018-10-13 16:25:48 +00:00
// Load the application routes
require BASE_DIR . 'app/routes.php';