. */ declare(strict_types=1); namespace Fisharebest\Webtrees; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Throwable; // Bootstrap the application require 'includes/session.php'; DebugBar::startMeasure('routing'); // The HTTP request. $request = Request::createFromGlobals(); $method = $request->getMethod(); $route = $request->get('route'); // Most requests will need the current tree and user. $all_tree_names = array_keys(Tree::getNameList()); $first_tree_name = current($all_tree_names) ?? ''; $previous_tree_name = Session::get('GEDCOM', $first_tree_name); $default_tree_name = $previous_tree_name ?: Site::getPreference('DEFAULT_GEDCOM'); $tree_name = $request->get('ged', $default_tree_name); $tree = Tree::findByName($tree_name); Session::put('GEDCOM', $tree_name); $request->attributes->set('tree', $tree); $request->attributes->set('user', AUth::user()); // Load the routing table. $routes = require 'routes/web.php'; // Find the action for the selected route $controller_action = $routes[$method . ':' . $route] ?? null; // No access to this route? Go somewhere else. if ($controller_action === null) { if ($tree instanceof Tree && $tree->getPreference('imported') === '1') { $response = new RedirectResponse(route('tree-page', ['ged' => $tree->getName()])); } elseif (!Auth::check()) { // Probably need to log in to see this page? $response = new RedirectResponse(Html::url('login.php', ['url' => $request->getRequestUri()])); } elseif (Auth::isAdmin()) { // No tree or tree not imported? $response = new RedirectResponse(Html::url('admin_trees_manage.php', [])); } return $response->prepare($request)->send(); } DebugBar::stopMeasure('routing'); DebugBar::startMeasure('create controller'); // Create the controller list($controller_name, $action) = explode('@', $controller_action); $controller_class = __NAMESPACE__ . '\\Http\\Controllers\\' . $controller_name; $controller = new $controller_class; DebugBar::stopMeasure('create controller'); // Note that we can't stop this timer, as running the action will // generate the response - which includes (and stops) the timer DebugBar::startMeasure('controller_action', $controller_action); if ($method === 'POST' && Database::isConnected()) { Database::beginTransaction(); try { /** @var Response $response */ $response = $controller->$action($request); Database::commit(); } catch (Throwable $ex) { DebugBar::addThrowable($ex); Database::rollBack(); // Yikes! Something went badly wrong. throw $ex; } } else { /** @var Response $response */ $response = $controller->$action($request); } // Send response if ($response instanceof RedirectResponse) { // Show the debug data on the next page DebugBar::stackData(); } elseif ($response instanceof JsonResponse) { // Use HTTP headers and some jQuery to add debug to the current page. DebugBar::sendDataInHeaders(); } return $response->prepare($request)->send();