Exception:
Array
(
    [message] => Call to undefined function Vvveb\config()
    [file] => /home/www/vvveb/www/system/core/startup.php
    [line_no] => 463
    [line] => $dbDefault  = \Vvveb\config('db.default', 'default');	 // <==

    [lines] => Array
        (
            [0] => //spl_autoload_register('Vvveb\System\Core\autoload_vendor');

            [1] => set_exception_handler('Vvveb\System\Core\exceptionHandler');

            [2] => set_error_handler('Vvveb\System\Core\vErrorHandler');

            [3] => register_shutdown_function('Vvveb\System\Core\fatalErrorHandler');

            [4] => 

            [5] => require DIR_ROOT . '/vendor/autoload.php';

            [6] => 

            [7] => $dbDefault  = \Vvveb\config('db.default', 'default');	 // <==

            [8] => $connection = \Vvveb\config('db.connections.' . $dbDefault,  []);

            [9] => 

            [10] => if ($connection) {

            [11] => 	// Define default database configuration

            [12] => 	// skipped when an entry point (e.g. the test bootstrap) already defined

            [13] => 	// DB_ENGINE to run against a different backend than config/db.php

        )

    [trace] => #0 /home/www/vvveb/www/index.php(102): require_once()
#1 /home/www/vvveb/www/public/index.php(28): include('...')
#2 {main}
    [code] => Array
        (
            [0] =>  

            [2] => /**

            [3] =>  * Vvveb

            [4] =>  *

            [5] =>  * Copyright (C) 2022  Ziadin Givan

            [6] =>  *

            [7] =>  * This program is free software: you can redistribute it and/or modify

            [8] =>  * it under the terms of the GNU Affero General Public License as

            [9] =>  * published by the Free Software Foundation, either version 3 of the

            [10] =>  * License, or (at your option) any later version.

            [11] =>  *

            [12] =>  * This program is distributed in the hope that it will be useful,

            [13] =>  * but WITHOUT ANY WARRANTY; without even the implied warranty of

            [14] =>  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

            [15] =>  * GNU Affero General Public License for more details.

            [16] =>  *

            [17] =>  * You should have received a copy of the GNU Affero General Public License

            [18] =>  * along with this program.  If not, see .

            [19] =>  *

            [20] =>  */

            [21] => 

            [22] => namespace Vvveb\System\Core;

            [23] => 

            [24] => use function Vvveb\camelToUnderscore;

            [25] => use Vvveb\System\Extensions\Plugins;

            [26] => use Vvveb\System\Session;

            [27] => use Vvveb\System\Sites;

            [28] => use Vvveb\System\Sqlp\Sqlp;

            [29] => 

            [30] => $storage_dir = DIR_ROOT . 'storage' . DS;

            [31] => 

            [32] => if (is_writable($storage_dir)) {

            [33] => 	define('DIR_STORAGE', $storage_dir);

            [34] => } else {

            [35] => 	$storage_dir = sys_get_temp_dir() . DS . 'storage' . DS;

            [36] => 

            [37] => 	if (! is_dir($storage_dir)) {

            [38] => 		@mkdir($storage_dir);

            [39] => 		@mkdir($storage_dir . 'compiled-templates' . DS);

            [40] => 		@mkdir($storage_dir . 'cache');

            [41] => 		@mkdir($storage_dir . 'model');

            [42] => 		@mkdir($storage_dir . join(DS, ['model', 'admin']) . DS);

            [43] => 		@mkdir($storage_dir . join(DS, ['model/app']) . DS);

            [44] => 		@mkdir($storage_dir . join(DS, ['model/install']) . DS);

            [45] => 	}

            [46] => 

            [47] => 	define('DIR_STORAGE', $storage_dir);

            [48] => }

            [49] => 

            [50] => define('DIR_CACHE', DIR_ROOT . join(DS, ['storage', 'cache']) . DS);

            [51] => define('DIR_PLUGINS', DIR_ROOT . 'plugins' . DS);

            [52] => define('DIR_COMPILED_TEMPLATES', DIR_STORAGE . 'compiled-templates' . DS);

            [53] => define('DIR_BACKUP', DIR_STORAGE . 'backup' . DS);

            [54] => define('DIR_THEMES', DIR_ROOT . join(DS, ['public', 'themes']) . DS);

            [55] => define('DIR_PUBLIC', DIR_ROOT . 'public' . DS);

            [56] => 

            [57] => if (APP === 'app') {

            [58] => 	define('DIR_THEME', DIR_ROOT . join(DS, ['public', 'themes']) . DS);

            [59] => } else {

            [60] => 	define('DIR_THEME', DIR_ROOT . 'public' . DS . APP . DS);

            [61] => }

            [62] => 

            [63] => define('DIR_APP', DIR_ROOT . APP . DS);

            [64] => define('DIR_TEMPLATE', DIR_APP . 'template' . DS);

            [65] => define('DIR_MEDIA', DIR_PUBLIC . 'media' . DS);

            [66] => define('CDATA_START', ' define('CDATA_END', ']]>');

            [68] => 

            [69] => $error_log = ini_get('error_log');

            [70] => 

            [71] => if (! $error_log || $error_log === '/dev/null') {

            [72] => 	ini_set('error_log', $storage_dir . 'logs/error_log');

            [73] => }

            [74] => 

            [75] => ini_set('opcache.file_cache', DIR_CACHE);

            [76] => 

            [77] => include DIR_SYSTEM . 'session.php';

            [78] => 

            [79] => include DIR_SYSTEM . 'component/component.php';

            [80] => 

            [81] => require_once DIR_SYSTEM . 'core/frontcontroller.php';

            [82] => 

            [83] => require_once DIR_SYSTEM . 'core/view.php';

            [84] => 

            [85] => require_once DIR_SYSTEM . 'functions.php';

            [86] => 

            [87] => require_once DIR_SYSTEM . 'event.php';

            [88] => 

            [89] => /**

            [90] =>  * Log an error message to the error log.

            [91] =>  *

            [92] =>  * @param string $message The error message to log.

            [93] =>  *

            [94] =>  * @return bool True if the message was successfully written to the log.

            [95] =>  */

            [96] => function logError(string $message): bool {

            [97] => 	return error_log($message);

            [98] => }

            [99] => 

            [100] => /**

            [101] =>  * Regenerate a SQL model file from a SQL definition file.

            [102] =>  *

            [103] =>  * @param string $sqlFile   Path to the SQL definition file.

            [104] =>  * @param string $file      Output path for the generated PHP model file.

            [105] =>  * @param string $modelName The model class name.

            [106] =>  * @param string $namespace The namespace for the generated model class.

            [107] =>  *

            [108] =>  * @return void

            [109] =>  */

            [110] => function regenerateSQL(string $sqlFile, string $file, string $modelName, string $namespace): void {

            [111] => 	$sqlp = new Sqlp();

            [112] => 

            [113] => 	$sqlp->parseSqlPfile($sqlFile, $modelName, $namespace);

            [114] => 

            [115] => 	$dir = dirname($file);

            [116] => 

            [117] => 	if (! file_exists($dir)) {

            [118] => 		@mkdir($dir,0755,true);

            [119] => 	}

            [120] => 

            [121] => 	$code = "generateModel();

            [122] => 

            [123] => 	//never write a broken model to disk, a parse error here would poison every request

            [124] => 	if (token_get_all($code, TOKEN_PARSE) === false) {

            [125] => 		throw new \Exception(sprintf('Generated SQL model %s has invalid syntax!', $file));

            [126] => 	}

            [127] => 

            [128] => 	//write to a temp file and rename, so concurrent requests never read a half written model

            [129] => 	$tmp = $file . '.' . getmypid() . '.tmp';

            [130] => 	file_put_contents($tmp, $code);

            [131] => 	rename($tmp, $file);

            [132] => }

            [133] => 

            [134] => /**

            [135] =>  * Autoload classes under the Vvveb namespace.

            [136] =>  *

            [137] =>  * Resolves class names to file paths, handling plugin SQL classes,

            [138] =>  * system classes, app/admin controllers, and standard models.

            [139] =>  *

            [140] =>  * @param string $class The fully-qualified class name to autoload.

            [141] =>  *

            [142] =>  * @return void

            [143] =>  */

            [144] => function autoload(string $class): void {

            [145] => 	// project-specific namespace prefix

            [146] => 	$prefix = 'Vvveb\\';

            [147] => 

            [148] => 	// does the class use the namespace prefix?

            [149] => 	$len = strlen($prefix);

            [150] => 

            [151] => 	if (strncmp($prefix, $class, $len) !== 0) {

            [152] => 		// no, move to the next registered autoloader

            [153] => 		return;

            [154] => 	}

            [155] => 

            [156] => 	$relativeClass = substr($class, $len);

            [157] => 	$isPlugin      = str_starts_with($relativeClass, 'Plugins\\');

            [158] => 	// replace the namespace prefix with the base directory, replace namespace

            [159] => 	// separators with directory separators in the relative class name, append

            [160] => 	// with .inc

            [161] => 	$root = DIR_APP;

            [162] => 

            [163] => 	//if namespace is Vvveb\System or Vvveb\Plugins load from root dir above app dir

            [164] => 	if ((str_starts_with($relativeClass, 'System\\')) ||

            [165] => 		$isPlugin ||

            [166] => 		(str_starts_with($relativeClass, 'Sql\Plugins\\'))) {

            [167] => 		$root = DIR_ROOT;

            [168] => 	}

            [169] => 

            [170] => 	//if namespace is App change to app dir

            [171] => 	if (str_starts_with($relativeClass, 'App\\')) {

            [172] => 		$root = DIR_ROOT . 'app' . DS;

            [173] => 	}

            [174] => 

            [175] => 	//if namespace is Admin change to admin dir

            [176] => 	if (str_starts_with($relativeClass, 'Admin\\')) {

            [177] => 		$root = DIR_ROOT . 'admin' . DS;

            [178] => 	}

            [179] => 

            [180] => 	//sql model classes are generated from .sql definition files

            [181] => 	if (substr_compare($relativeClass, 'SQL', -3, 3) === 0) {

            [182] => 		autoloadSqlModel($relativeClass);

            [183] => 

            [184] => 		return;

            [185] => 	}

            [186] => 

            [187] => 	//load any other Vvveb class from the app/system/plugin directories

            [188] => 	$file     = $root . str_replace('\\', '/', camelToUnderscore($relativeClass)) . '.php';

            [189] => 	$fileAsIs = $root . str_replace('\\', '/',  strtolower($relativeClass)) . '.php';

            [190] => 	

            [191] => 

            [192] => 	if ($isPlugin && ($isController = str_contains($relativeClass, 'Controller\\'))) {

            [193] => 		$file     = str_replace('/controller/', '/' . APP . '/controller/', $file);

            [194] => 		$fileAsIs = str_replace('/controller/', '/' . APP . '/controller/', $fileAsIs);

            [195] => 	}

            [196] => 	

            [197] => 	foreach ([$file, $fileAsIs] as $f) {

            [198] => 		if (file_exists($f)) {

            [199] => 			require_once $f;

            [200] => 			return;

            [201] => 		}

            [202] => 	}

            [203] => 

            [204] => 	//throw(new \Exception($class . ' could not be loaded!'));

            [205] => }

            [206] => 

            [207] => /**

            [208] =>  * Resolve, generate when stale, and load a SQL model class.

            [209] =>  *

            [210] =>  * Called by autoload() for every class ending in SQL.

            [211] =>  *

            [212] =>  * @param string $relativeClass Class name without the Vvveb\ prefix.

            [213] =>  */

            [214] => function autoloadSqlModel(string $relativeClass): void {

            [215] => 	$isFromPlugin = str_contains($relativeClass, 'Plugins\\');

            [216] => 	$sqlFile      = str_replace(['Sql', '\\'], ['', DS], substr($relativeClass, 0, -3));

            [217] => 

            [218] => 	if ($isFromPlugin) {

            [219] => 		//convert camelCase to snake_case

            [220] => 		$sqlFile    = strtolower(preg_replace('/(? 		$file       = basename($sqlFile);

            [222] => 		$pluginName = str_replace([DS . 'plugins' . DS, DS . $file], '', $sqlFile) . DS;

            [223] => 		$pluginName = strtolower(preg_replace('/(? 		$sqlFile    = DIR_PLUGINS . $pluginName . 'sql' . DS . DB_ENGINE . DS . $file . '.sql';

            [225] => 	} else {

            [226] => 		$sqlFile   = strtolower($sqlFile) . '.sql';

            [227] => 	}

            [228] => 

            [229] => 	$name      = str_replace(['\\', 'sql' . DS], [DS, ''], strtolower($relativeClass));

            [230] => 	$modelName = ucwords(basename(str_replace('sql', '', $name)));

            [231] => 	$namespace = ucwords(dirname($name));

            [232] => 

            [233] => 	if ($namespace !== '.') {

            [234] => 		$namespace = str_replace('/', '\\', "\\$namespace");

            [235] => 	} else {

            [236] => 		$namespace = '';

            [237] => 	}

            [238] => 

            [239] => 	$file       = DIR_STORAGE . 'model' . DS . APP . DS . $name . '.' . DB_ENGINE . '.php';

            [240] => 	$fileExists = file_exists($file);

            [241] => 

            [242] => 	if (SQL_CHECK || ! $fileExists) {

            [243] => 		$sqlExists = false;

            [244] => 

            [245] => 		if ($isFromPlugin) {

            [246] => 			$fullSqlFile = $sqlFile;

            [247] => 			$sqlExists   = file_exists($fullSqlFile);

            [248] => 		} else {

            [249] => 			//fallback to admin if sql file is missing in APP

            [250] => 			foreach ([APP, 'admin'] as $app) {

            [251] => 				$fullSqlFile = DIR_ROOT . $app . DS . 'sql' . DS . DB_ENGINE . DS . $sqlFile;

            [252] => 

            [253] => 				if (file_exists($fullSqlFile)) {

            [254] => 					$sqlExists = true;

            [255] => 

            [256] => 					break;

            [257] => 				}

            [258] => 			}

            [259] => 		}

            [260] => 

            [261] => 		if (! $sqlExists) {

            [262] => 			throw new \Exception(sprintf(\Vvveb\__('SQL file %s does not exist for %s!'), $sqlFile, $relativeClass));

            [263] => 		}

            [264] => 		//if the file has not been generated yet or sql files is changed recompile

            [265] => 		if (! $fileExists || ((filemtime($fullSqlFile) > filemtime($file)))) {

            [266] => 			regenerateSQL($fullSqlFile, $file, $modelName, $namespace);

            [267] => 			$fileExists = true;

            [268] => 		}

            [269] => 	}

            [270] => 

            [271] => 	if ($fileExists) {

            [272] => 		require_once $file;

            [273] => 	}

            [274] => 	}

            [275] => 

            [276] => /**

            [277] =>  * Autoload vendor classes from the vendor directory.

            [278] =>  *

            [279] =>  * @param string $class The fully-qualified class name to autoload.

            [280] =>  *

            [281] =>  * @return void

            [282] =>  */

            [283] => function autoload_vendor(string $class): void {

            [284] => 	$path = str_replace('\\', DS, $class);

            [285] => 

            [286] => 	$file = DIR_ROOT . 'vendor' . DS . "$path.php";

            [287] => 

            [288] => 	// if the file exists, require it

            [289] => 	if (file_exists($file)) {

            [290] => 		require_once $file;

            [291] => 	}

            [292] => }

            [293] => 

            [294] => /**

            [295] =>  * Convert a throwable exception to a structured array with context.

            [296] =>  *

            [297] =>  * Extracts the message, file, line, surrounding code context, and stack trace

            [298] =>  * from the given exception.

            [299] =>  *

            [300] =>  * @param \Throwable   $exception The exception to convert.

            [301] =>  * @param string|false $file      Optional override for the source file path.

            [302] =>  *

            [303] =>  * @return array Structured error information array.

            [304] =>  */

            [305] => function exceptionToArray(\Throwable $exception, string|false $file = false): array {

            [306] => 	$file   = $exception->getFile() ? $exception->getFile() : $file;

            [307] => 	$lineNo = $exception->getLine() - 1;

            [308] => 	//$code = $exception->getCode();

            [309] => 	$class     = get_class($exception);

            [310] => 	$lines     = [];

            [311] => 	$codeLines = [];

            [312] => 	$line      = $lineNo;

            [313] => 	$code      = '';

            [314] => 

            [315] => 	if (! defined('CLI') && $file && file_exists($file) && ($codeLines = file($file)) && isset($codeLines[$lineNo])) {

            [316] => 		$codeLines[$lineNo] = preg_replace("/\n$/","\t // <==\n", $codeLines[$lineNo]);

            [317] => 		$lines              = array_slice($codeLines, $lineNo - 7, 14);

            [318] => 		$line               = implode("\n", array_slice($codeLines, $lineNo, 1));

            [319] => 		$before             = implode("\n", array_slice($codeLines, $lineNo - 6, 5));

            [320] => 		$after              = implode("\n", array_slice($codeLines, $lineNo + 1, 5));

            [321] => 		$code               = "$before$line$after";

            [322] => 	}

            [323] => 

            [324] => 	$message = [

            [325] => 		'message' => $exception->getMessage(),

            [326] => 		'file'    => $file,

            [327] => 		'line_no' => $lineNo,

            [328] => 		'line'    => $line,

            [329] => 		'lines'   => $lines,

            [330] => 		'trace'   => $exception->getTraceAsString(),

            [331] => 		'code'    => $codeLines,

            [332] => 	];

            [333] => 

            [334] => 	return $message;

            [335] => }

            [336] => 

            [337] => /**

            [338] =>  * Handle uncaught exceptions globally.

            [339] =>  *

            [340] =>  * Converts the exception to an array, checks for plugin errors, and

            [341] =>  * outputs debug information when DEBUG mode is enabled.

            [342] =>  *

            [343] =>  * @param \Throwable $exception The uncaught exception.

            [344] =>  *

            [345] =>  * @return void

            [346] =>  */

            [347] => function exceptionHandler(\Throwable $exception): void {

            [348] => 	static $handled;

            [349] => 

            [350] => 	if ($handled) {

            [351] => 		if (DEBUG) {

            [352] => 			echo $exception->getMessage() . ' in ' . $exception->getFile() . ' on line ' . $exception->getLine();

            [353] => 		} else {

            [354] => 			die('Server error, enable debug for more info');

            [355] => 		}

            [356] => 		return;

            [357] => 	}

            [358] => 	$handled = true;

            [359] => 

            [360] => 	$message = exceptionToArray($exception, $exception->getFile());

            [361] => 	//check if error is generated by a plugin and disable it

            [362] => 	pluginErrorCheck($message['file']);

            [363] => 

            [364] => 	//FrontController::notFound(false, $message, 500);

            [365] => 	//pluginErrorCheck($file);

            [366] => 	if (DEBUG) {

            [367] => 		echo 'Exception:
';

            [368] => 		print_r($message);

            [369] => 		echo '
'; [370] => } [371] => } [372] => [373] => /** [374] => * Custom error handler for PHP errors. [375] => * [376] => * Checks if the error is within the current error_reporting level, handles [377] => * plugin errors, and throws ErrorException for fatal errors. [378] => * [379] => * @param int $errno The error level constant (e.g. E_WARNING). [380] => * @param string $errstr The error message. [381] => * @param string $errfile The filename where the error occurred. [382] => * @param int $errline The line number where the error occurred. [383] => * [384] => * @return bool Returns false to allow the PHP error handler to continue. [385] => */ [386] => function vErrorHandler(int $errno, string $errstr, string $errfile, int $errline): bool { [387] => if (! (error_reporting() && $errno)) { [388] => // This error code is not included in error_reporting, so let it fall [389] => // through to the standard PHP error handler [390] => return false; [391] => } [392] => // $errstr may need to be escaped: [393] => $errstr = htmlspecialchars($errstr); [394] => [395] => switch ($errno) { [396] => case E_USER_WARNING: [397] => case E_WARNING: [398] => case E_USER_NOTICE: [399] => break; [400] => [401] => case E_ERROR: [402] => case E_USER_ERROR: [403] => //check if error is generated by a plugin and disable it [404] => pluginErrorCheck($errfile); [405] => [406] => throw new \ErrorException($errstr, $errno, 0, $errfile, $errline); [407] => //return FrontController::notFound(false, $errstr, 500); [408] => } [409] => [410] => /* Don't execute PHP internal error handler */ [411] => return false; [412] => } [413] => [414] => /** [415] => * Check if an error originates from a plugin and optionally disable it. [416] => * [417] => * If the error file path is within the plugins directory, logs the error [418] => * and deactivates the offending plugin when DISABLE_PLUGIN_ON_ERORR is true. [419] => * [420] => * @param string $file The file path where the error occurred. [421] => * [422] => * @return bool True if the error is from a plugin, false otherwise. [423] => */ [424] => function pluginErrorCheck(string $file): bool { [425] => if (str_contains($file, DIR_PLUGINS)) { [426] => $plugin = \Vvveb\filter('@([^/]+)@', str_replace(DIR_PLUGINS, '', $file)); [427] => logError("'$plugin' plugin triggers fatal error."); [428] => [429] => if (DISABLE_PLUGIN_ON_ERORR) { [430] => logError(sprintf(\Vvveb\__('Disabling "%s" plugin.'), $plugin)); [431] => Plugins::deactivate($plugin); [432] => } [433] => [434] => return true; [435] => } [436] => [437] => return false; [438] => } [439] => [440] => /** [441] => * Shutdown handler that catches fatal errors. [442] => * [443] => * Retrieves the last error and delegates it to the custom error handler. [444] => * [445] => * @return void [446] => */ [447] => function fatalErrorHandler(): void { [448] => $message = error_get_last(); [449] => [450] => if ($message) { [451] => vErrorHandler($message['type'], $message['message'],$message['file'], $message['line']); [452] => } [453] => } [454] => [455] => spl_autoload_register('Vvveb\System\Core\autoload'); [456] => //spl_autoload_register('Vvveb\System\Core\autoload_vendor'); [457] => set_exception_handler('Vvveb\System\Core\exceptionHandler'); [458] => set_error_handler('Vvveb\System\Core\vErrorHandler'); [459] => register_shutdown_function('Vvveb\System\Core\fatalErrorHandler'); [460] => [461] => require DIR_ROOT . '/vendor/autoload.php'; [462] => [463] => $dbDefault = \Vvveb\config('db.default', 'default'); // <== [464] => $connection = \Vvveb\config('db.connections.' . $dbDefault, []); [465] => [466] => if ($connection) { [467] => // Define default database configuration [468] => // skipped when an entry point (e.g. the test bootstrap) already defined [469] => // DB_ENGINE to run against a different backend than config/db.php [470] => if (! defined('DB_ENGINE')) { [471] => define('DB_ENGINE', $connection['engine']); [472] => define('DB_HOST', $connection['host'] ?? ''); [473] => define('DB_USER', $connection['user'] ?? ''); [474] => define('DB_PASS', $connection['password'] ?? ''); [475] => define('DB_NAME', $connection['database'] ?? ''); [476] => define('DB_PREFIX', $connection['prefix'] ?? ''); [477] => define('DB_PORT', $connection['port'] ?? null); [478] => } [479] => } [480] => [481] => if (defined('DB_ENGINE')) { [482] => define('DIR_SQL', DIR_APP . 'sql' . DS . DB_ENGINE . DS); [483] => } [484] => [485] => /** [486] => * Bootstrap the application by resolving the site and dispatching the request. [487] => * [488] => * Loads the site configuration, defines site constants, loads plugins for [489] => * the frontend, and dispatches the request via the FrontController. [490] => * [491] => * @return void [492] => */ [493] => function start(): void { [494] => $site_id = false; [495] => $path = $_SERVER['REQUEST_URI'] ?? '/'; [496] => [497] => if (isset($_GET['site_id'])) { [498] => //check if admin user to allow site id override for editor [499] => if ($admin = \Vvveb\System\User\Admin :: current()) { [500] => $site_id = (int)$_GET['site_id']; [501] => } [502] => } [503] => [504] => $site = Sites :: getSiteData($site_id, $path); [505] => [506] => if ($site) { [507] => define('SITE_URL', $site['host']); [508] => define('SITE_ID', $site['site_id'] ?? 1); [509] => define('SITE_URI', $site['uri'] ?? ''); [510] => define('SITE_PATH', $site['path'] ?? ''); [511] => [512] => //load plugins first for APP [513] => if (APP !== 'admin') { [514] => Plugins :: loadPlugins(SITE_ID); [515] => } [516] => [517] => defined('DISPATCH') || define('DISPATCH', true); [518] => [519] => if (DISPATCH) { [520] => FrontController::dispatch($site); [521] => } [522] => } else { [523] => define('SITE_URL', $_SERVER['HTTP_HOST'] ?? 'localhost'); [524] => define('SITE_ID', 1); [525] => define('SITE_URI', ''); [526] => define('SITE_PATH', ''); [527] => FrontController::notFound(false, 'Website not found!'); [528] => } [529] => } ) )