stela/index.php

132 lines
3.4 KiB
PHP
Raw Normal View History

2020-01-23 12:10:33 +00:00
<?php
// see app.php for application logic
2020-01-23 14:17:37 +00:00
if (!file_exists('config.php')) die('APP not configured');
$config = require 'config.php';
2020-01-23 12:10:33 +00:00
// AUTOLOADING
spl_autoload_register(function ($class){
require __DIR__ . '/lib/' . str_replace('\\', '/', $class) . '.php';
});
// ERRORS
require __DIR__ . '/lib/tracy.php';
use \Tracy\Debugger;
Debugger::enable(!empty($config['show_debug']) ? Debugger::DEVELOPMENT : Debugger::DETECT);
Debugger::$showBar = false;
Debugger::$errorTemplate = __DIR__ . '/tpl/500.htm';
2020-01-23 14:17:37 +00:00
// FRAMEWORK API
2020-01-23 12:10:33 +00:00
$routeCollector = new FastRoute\RouteCollector(new FastRoute\RouteParser\Std(), new FastRoute\DataGenerator\GroupCountBased());
2020-01-27 15:39:57 +00:00
function user()
{
return $_SESSION['user'] ?? false;
}
// TODO - requireLogin
2020-01-23 12:10:33 +00:00
2020-01-27 15:07:44 +00:00
$dependencies = $singletons = [];
2020-01-23 14:17:37 +00:00
2020-01-23 12:10:33 +00:00
function di($service)
{
2020-01-27 15:07:44 +00:00
global $dependencies, $singletons;
2020-01-23 14:17:37 +00:00
if (isset($dependencies[$service])) {
return $dependencies[$service];
2020-01-27 15:07:44 +00:00
} elseif (isset($singletons[$service])) {
$dependencies[$service] = $singletons[$service]();
return $dependencies[$service];
2020-01-23 14:17:37 +00:00
} else {
throw new Exception('Dependency ' . $service . ' not found!');
}
2020-01-23 12:10:33 +00:00
}
function flash($msg)
{
2020-01-27 15:39:57 +00:00
$_SESSION['flashes'][] = $msg;
2020-01-23 12:10:33 +00:00
}
function redirect($url, $status = 302)
{
2020-01-24 10:49:34 +00:00
if (strpos($url, '/')===0) {
// TODO - zde nemít zadrátované HTTP
$url = 'http://' . $_SERVER['HTTP_HOST'] . $url;
}
return response('See ' . $url, 302, ['Location'=>$url]);
2020-01-23 12:10:33 +00:00
}
2020-01-23 15:09:58 +00:00
function render($view, $data=[])
2020-01-23 12:10:33 +00:00
{
2020-01-23 12:18:54 +00:00
$tplFile = __DIR__ . '/tpl/' . $view . '.php';
if (file_exists($tplFile)) {
extract($data, EXTR_SKIP);
ob_start();
include $tplFile;
$output = ob_get_contents();
ob_end_clean();
return $output;
} else {
throw new Exception('Template '.$view.' not found in file '.$tplFile);
}
2020-01-23 12:10:33 +00:00
}
function response($body, $status=200, $headers=[])
{
2020-01-24 10:49:34 +00:00
return new Nyholm\Psr7\Response($status, $headers, $body);
2020-01-23 12:10:33 +00:00
}
function notFound()
{
2020-01-24 10:49:34 +00:00
return response(render('404.html'), 404);
2020-01-23 12:10:33 +00:00
}
function route($method, $url, $callback)
{
global $routeCollector;
if (empty($method)) $method = ['GET', 'POST'];
$routeCollector->addRoute($method, $url, $callback);
}
2020-01-27 15:07:44 +00:00
2020-01-23 14:17:37 +00:00
// ROUTES
2020-01-23 12:10:33 +00:00
require 'app.php';
// finally running the APP
2020-01-27 15:39:57 +00:00
session_start(); // TODO - nakonfit session
2020-01-23 12:10:33 +00:00
$routeDispatcher = new FastRoute\Dispatcher\GroupCountBased($routeCollector->getData());
2020-01-23 15:09:58 +00:00
$request = new Nyholm\Psr7\ServerRequest($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], getallheaders());
if ($request->getMethod()=='POST') {
$request = $request->withParsedBody($_POST);
}
2020-01-23 12:10:33 +00:00
$routeInfo = $routeDispatcher->dispatch($request->getMethod(), $request->getUri());
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::NOT_FOUND:
2020-01-23 15:09:58 +00:00
throw new Exception('Not found!');
2020-01-23 12:10:33 +00:00
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$allowedMethods = $routeInfo[1];
2020-01-23 15:09:58 +00:00
throw new Exception('Method Not Allowed');
2020-01-23 12:10:33 +00:00
break;
case FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
2020-01-24 10:49:34 +00:00
// todo - zde přidat atributy
ob_start();
$response = $handler($request, $vars);
$output = ob_end_clean();
if (empty($response) && !empty($output)) $response = $output;
if (is_string($response)) $response = response($response);
$emmitter = new Narrowspark\HttpEmitter\SapiEmitter();
$emmitter->emit($response);
2020-01-23 12:10:33 +00:00
break;
2020-01-23 15:09:58 +00:00
}