/** * @param Knit $knit * @param string $tpl * @param string $param * @throws \Comely\Framework\KernelException */ public function knit(Knit $knit, string $tpl, string $param = "body") { // Get CSRF token $csrfToken = $this->app->security()->csrf()->getToken(); if (!$csrfToken) { // Set new CSRF token as it is not already set $csrfToken = $this->app->security()->csrf()->setToken(); } // Set "csrfToken" prop in Page object $this->page->setProp("csrfToken", $csrfToken); // Assign variables to Knit $knit->assign("errors", $this->app->errorHandler()->fetchAll()); $knit->assign("page", $this->page->getArray()); $knit->assign("config", ["site" => $this->app->config()->getNode("site")]); // Prepare template and set in Response object $template = $knit->prepare($tpl); $this->response->set($param, $template->getOutput()); }
/** * @param \Throwable $t * @throws \Comely\Framework\KernelException * @throws \Comely\KnitException */ public function send(\Throwable $t) { $knit = (new Knit())->setTemplatePath(__DIR__)->setCompilerPath($this->kernel->getDisk("cache")); // Extract information from \Throwable $error = ["message" => null, "method" => null, "code" => $t->getCode(), "file" => $t->getFile(), "line" => $t->getLine(), "trace" => []]; // Check if exception has "getTranslated" method $error["message"] = method_exists($t, "getTranslated") ? $t->getTranslated() : $t->getMessage(); // Check if exception is child of ComelyException if (method_exists($t, "getMethod") && is_subclass_of($t, "ComelyException")) { $error["method"] = $t->getMethod(); $error["source"] = "Component"; } else { $error["method"] = get_class($t); $error["source"] = "Caught"; } // Populate Trace foreach ($t->getTrace() as $trace) { if (Arrays::hasKeys($trace, ["function", "file", "line"])) { $trace["method"] = $trace["function"]; if (isset($trace["class"])) { $trace["method"] = $trace["class"] . $trace["type"] . $trace["function"]; } $error["trace"][] = $trace; } } // Config $config = $this->kernel->config()->getNode("app"); $display = ["backtrace" => $config["errorHandler"]["screen"]["debugBacktrace"] ?? false, "triggered" => $config["errorHandler"]["screen"]["triggeredErrors"] ?? false, "paths" => $config["errorHandler"]["screen"]["completePaths"] ?? false]; // Assign values $knit->assign("display", $display); $knit->assign("error", $error); $knit->assign("triggered", $this->kernel->errorHandler()->fetchAll()); $knit->assign("version", ["comely" => \Comely::VERSION, "kernel" => Kernel::VERSION, "framework" => Kernel::VERSION, "knit" => Knit::VERSION]); // Prepare template $screen = $knit->prepare("screen.knit"); $screen = str_replace("%%knit-timer%%", number_format($screen->getTimer(), 6, ".", ""), $screen->getOutput()); exit($screen); }