public function __construct(string $viewPath = null, $loader = null)
 {
     $this->viewPath = rtrim($viewPath, '/ ') . '/';
     if (!is_null($loader)) {
         $this->loader = $loader;
     } else {
         $this->loader = Services::loader(true);
     }
 }
 /**
  * Loads a helper file into memory. Supports namespaced helpers,
  * both in and out of the 'helpers' directory of a namespaced directory.
  *
  * @param string $filename
  *
  * @return string
  */
 function load_helper(string $filename) : string
 {
     $loader = \App\Config\Services::loader(true);
     $path = $loader->locateFile($filename, 'helpers');
     if (!empty($path)) {
         include $path;
     }
 }
if ($config->CSRFProtection === true && !is_cli()) {
    $security = \App\Config\Services::security($config);
    $security->CSRFVerify();
}
//--------------------------------------------------------------------
// Get our Request and Response objects
//--------------------------------------------------------------------
$request = is_cli() ? \App\Config\Services::clirequest($config) : \App\Config\Services::request($config);
$response = \App\Config\Services::response();
// Assume success until proven otherwise.
$response->setStatusCode(200);
//--------------------------------------------------------------------
// Try to Route It
//--------------------------------------------------------------------
require APPPATH . 'config/Routes.php';
$router = \App\Config\Services::router($routes, true);
$path = is_cli() ? $request->getPath() : $request->uri->getPath();
$controller = $router->handle($path);
ob_start();
// Is it routed to a Closure?
if (is_callable($controller)) {
    echo $controller(...$router->params());
} else {
    if (empty($controller)) {
        // Show the 404 error page
        if (is_cli()) {
            require APPPATH . 'views/errors/cli/error_404.php';
        } else {
            require APPPATH . 'views/errors/html/error_404.php';
        }
        $response->setStatusCode(404);
 * --------------------------------------------------------------------
 * This file lets you re-map URI requests to specific controller functions.
 *
 * Typically there is a one-to-one relationship between a URL string
 * and its corresponding controller class/method. The segments in a
 * URL normally follow this pattern:
 *
 *    example.com/class/method/id
 *
 * In some instances, however, you may want to remap this relationship
 * so that a different class/function is called than the one
 * corresponding to the URL.
 *
 */
// Create a new instance of our RouteCollection class.
$routes = \App\Config\Services::routes();
/**
 * --------------------------------------------------------------------
 * Router Setup
 * --------------------------------------------------------------------
 * The RouteCollection object allows you to modify the way that the
 * Router works, by acting as a holder for it's configuration settings.
 * The following methods can be called on the object to modify
 * the default operations.
 *
 *    $routes->defaultNamespace()
 *
 * Modifies the namespace that is added to a controller if it doesn't
 * already have one. By default this is the global namespace (\).
 *
 *    $routes->defaultController()