made the code more composer friendly

This commit is contained in:
Nick Yeoman 2025-11-19 00:03:03 -08:00
parent a14df54cd9
commit 466d34c39f
12 changed files with 164 additions and 84 deletions

View File

@ -6,8 +6,7 @@
{
"name": "Nick Yeoman",
"email": "dev@4lt.ca",
"homepage": "https://www.4lt.ca",
"role": "Consultant"
"homepage": "https://www.4lt.ca"
}
],
"autoload": {
@ -16,6 +15,7 @@
}
},
"require": {
"php": "^8.1",
"twig/twig": "*",
"nickyeoman/php-validation-class": "^5.0"
},

View File

@ -1,6 +1,31 @@
<?php
/**
* Novaconium Framework Entry Point
*
* This is the main entry point for the Novaconium framework.
* It sets up the environment, loads necessary components,
* and runs the application.
*
* @package Novaconium
* @author Nick Yeoman <dev@4lt.ca>
*/
// Enable error reporting for development environments
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
// Define the base path where the website is running from
define('BASEPATH', dirname(__DIR__, 1));
require_once(BASEPATH . '/vendor/4lt/novaconium/src/novaconium.php');
?>
// Load Composer's autoload file to handle class autoloading
require BASEPATH . '/vendor/autoload.php';
// Define the framework path
define('FRAMEWORKPATH', BASEPATH . '/vendor/4lt/novaconium');
// Bootstrap the Novaconium framework, which will create necessary objects like $session, $db, etc.
require FRAMEWORKPATH . '/src/novaconium.php';
// Run the application
makeitso();

View File

@ -1,4 +1,5 @@
<?php
namespace Novaconium;
class Database {
@ -6,7 +7,7 @@ class Database {
public $lastid;
public function __construct($dbinfo) {
$this->conn = new mysqli($dbinfo['host'], $dbinfo['user'], $dbinfo['pass'], $dbinfo['name']);
$this->conn = new \mysqli($dbinfo['host'], $dbinfo['user'], $dbinfo['pass'], $dbinfo['name']);
if ($this->conn->connect_error) {
die("Connection failed: " . $this->conn->connect_error);
}

View File

@ -1,5 +1,5 @@
<?php
namespace Novaconium;
class Logger {
protected string $logFile;
protected int $logLevelThreshold;

View File

@ -1,5 +1,5 @@
<?php
namespace Novaconium;
class MessageHandler {
private $messages = [
'error' => [],

View File

@ -1,5 +1,5 @@
<?php
namespace Novaconium;
class Post {
private $data = [];

View File

@ -1,4 +1,5 @@
<?php
namespace Novaconium;
/**
* Use
* $redirect->url('/login');

View File

@ -1,5 +1,5 @@
<?php
namespace Novaconium;
class Router {
public $routes = [];
public $query = [];
@ -19,10 +19,10 @@ class Router {
}
private function loadRoutes() {
require_once(FRAMEWORKPATH . '/config/routes.php');
require_once( \FRAMEWORKPATH . '/config/routes.php');
// Check if Path exists
if (file_exists(BASEPATH . '/App/routes.php')) {
require_once( BASEPATH . '/App/routes.php');
if (file_exists(\BASEPATH . '/App/routes.php')) {
require_once( \BASEPATH . '/App/routes.php');
}
$routes = array_merge((array)$routes, (array)$framework_routes);
@ -109,19 +109,19 @@ class Router {
if (str_starts_with($this->controller, 'NOVACONIUM')) {
$trimmed = substr($this->controller, strlen('NOVACONIUM/'));
$cp = FRAMEWORKPATH . '/controllers/' . $trimmed . '.php';
$cp = \FRAMEWORKPATH . '/controllers/' . $trimmed . '.php';
} else {
$cp = BASEPATH . '/App/controllers/' . $this->controller . '.php';
$cp = \BASEPATH . '/App/controllers/' . $this->controller . '.php';
}
if (file_exists($cp)) {
return $cp;
} else {
//Check if 404 exits
if (file_exists(BASEPATH . '/App/controllers/404.php')) {
return BASEPATH . '/App/controllers/404.php';
if (file_exists( \BASEPATH . '/App/controllers/404.php')) {
return \BASEPATH . '/App/controllers/404.php';
} else {
return FRAMEWORKPATH . '/controllers/404.php';
return \FRAMEWORKPATH . '/controllers/404.php';
}
}
}

View File

@ -1,5 +1,5 @@
<?php
namespace Novaconium;
class Session {
private $session;

View File

@ -1,29 +1,60 @@
<?php
declare(strict_types=1);
/**
* Dump and Die
* Dump and Die (debug function)
*
* @param mixed ...$vars Any number of variables to dump and then exit the script.
*/
function dd(...$vars) {
echo "<pre style='background:#222;color:#0f0;padding:10px;border-radius:5px;'>";
function dd(...$vars): void {
echo "<pre style='background:#1e1e1e;color:#00ff00;padding:12px;border-radius:6px;font-size:14px;'>";
foreach ($vars as $var) {
var_dump($var);
echo "\n";
}
echo "</pre>";
die();
exit;
}
function makeitso() {
/**
* Finalize the request lifecycle.
*
* This function safely writes session data, stores flash messages, closes the database
* connection if configured, and performs a redirect.
*/
function makeitso(): void {
global $session, $db, $redirect, $config, $messages, $log;
if (!empty($config['database']['host'])) {
$db->close();
// ------------------------------
// Close database if configured
// ------------------------------
// Check if database configuration exists and the $db object is set
if (!empty($config['database']['host']) && isset($db)) {
// If the $db object has a close method, call it to close the connection
if (method_exists($db, 'close')) {
$db->close();
}
}
// ------------------------------
// Save flash messages to session
// ------------------------------
// Set all messages in the session
$session->set('messages', $messages->getAllMessages());
// Write any buffered session data to persistent storage
$session->write();
// ------------------------------
// Perform redirect
// ------------------------------
// Execute the redirect operation
$redirect->execute();
exit();
}
// Exit the script after processing is complete
exit;
}

View File

@ -1,63 +1,50 @@
<?php
require_once(BASEPATH . '/vendor/autoload.php');
define('FRAMEWORKPATH', BASEPATH . '/vendor/4lt/novaconium');
//Check if config file exists
if (file_exists(BASEPATH . '/App/config.php')) {
require_once(BASEPATH . '/App/config.php');
// --- Load Config ---
if (file_exists(\BASEPATH . '/App/config.php')) {
require_once \BASEPATH . '/App/config.php';
} else {
require_once(FRAMEWORKPATH . '/skeleton/novaconium/App/config.php');
require_once \FRAMEWORKPATH . '/skeleton/novaconium/App/config.php';
}
// Logging
require_once(FRAMEWORKPATH . '/src/Logger.php');
$log = new Logger(BASEPATH . $config['logfile'], $config['loglevel']);
// --- Logging ---
use Novaconium\Logger;
$log = new Logger(\BASEPATH . $config['logfile'], $config['loglevel']);
// Global Functions
require_once(FRAMEWORKPATH . '/src/functions.php');
// --- Twig Data Array ---
$data = [];
$data['fonts'] = $config['fonts'] ?? [];
// Creates the view() function using twig
$data = array();
require_once(FRAMEWORKPATH . '/src/twig.php');
$data['fonts'] = $config['fonts'];
// Start a Session
require_once(FRAMEWORKPATH . '/src/Session.php');
// --- Session ---
use Novaconium\Session;
$session = new Session();
$data['token'] = $session->get('token');
$data['token'] = $session->get('token');
$data['username'] = $session->get('username');
if ($config['loglevel'] == 'DEBUG') {
$data['debug'] = nl2br(print_r($session->debug(), true));
}
// Messages
require_once(FRAMEWORKPATH . '/src/MessageHandler.php');
// --- Messages ---
use Novaconium\MessageHandler;
$messages = new MessageHandler($session->flash('messages'));
foreach (['error','notice'] as $key){
$data[$key] = $messages->showMessages($key);
foreach (['error', 'notice'] as $key) {
$data[$key] = $messages->showMessages($key);
}
// Load Database Class
// --- Database ---
use Novaconium\Database;
if (!empty($config['database']['host'])) {
require_once(FRAMEWORKPATH . '/src/Database.php');
$db = new Database($config['database']);
}
// Sanatize POST Data
// --- POST Wrapper ---
use Novaconium\Post;
if (!empty($_POST)) {
require_once(FRAMEWORKPATH . '/src/Post.php');
$post = new Post($_POST);
}
// Start a Redirect
require_once(FRAMEWORKPATH . '/src/Redirect.php');
// --- Redirect Handler ---
use Novaconium\Redirect;
$redirect = new Redirect();
// Load a controller
require_once(FRAMEWORKPATH . '/src/Router.php');
// --- Router ---
use Novaconium\Router;
$router = new Router();
//$router->debug();
require_once($router->controllerPath);
makeitso();
require_once \BASEPATH . $router->controllerPath;

View File

@ -1,32 +1,67 @@
<?php
//Twig
function view($name = '', $moreData = []) {
global $config, $data; // Use the globally included $config
declare(strict_types=1);
if (!empty($moreData)){
use Twig\Environment;
use Twig\Loader\FilesystemLoader;
/**
* Render a Twig view.
*
* @param string $name Template name without extension (e.g. "index")
* @param array $moreData Additional variables to merge into template context
*
* @return bool
*/
function view(string $name = '', array $moreData = []): bool
{
global $config, $data;
// Ensure $data is always an array
if (!is_array($data)) {
$data = [];
}
// Merge additional data
if (!empty($moreData)) {
$data = array_merge($data, $moreData);
}
$loader = new Twig\Loader\FilesystemLoader(BASEPATH . '/App/views/');
$loader->addPath(FRAMEWORKPATH . '/twig', 'novaconium');
$loader->addPath(FRAMEWORKPATH . '/views', 'novacore');
$loader->addPath(BASEPATH . '/App/templates', 'override');
// ----------------------------------------
// Setup Twig
// ----------------------------------------
$twig = new Twig\Environment($loader);
$loader = new FilesystemLoader([
BASEPATH . '/App/views/',
FRAMEWORKPATH . '/twig',
FRAMEWORKPATH . '/views',
BASEPATH . '/App/templates/override'
]);
// Add config to Twig globally
$twig = new Environment($loader);
// Add global config
$twig->addGlobal('config', $config);
// Check if the template exists
if (file_exists(BASEPATH . '/App/views/' . $name . '.html.twig')) {
// ----------------------------------------
// Render template
// ----------------------------------------
// Direct App override template
$appTemplatePath = BASEPATH . '/App/views/' . $name . '.html.twig';
if (file_exists($appTemplatePath)) {
echo $twig->render($name . '.html.twig', $data);
return true;
} elseif (str_starts_with($name, '@')) { // Check if using framework
echo $twig->render($name . '.html.twig', $data);
return true;
} else {
echo "Error: Twig Template ($name) Not Found.";
return false;
}
// Namespaced Twig templates like @novaconium/whatever
if (str_starts_with($name, '@')) {
echo $twig->render($name . '.html.twig', $data);
return true;
}
// Fallback
echo "Error: Twig Template ($name) Not Found.";
return false;
}