Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mdevoldere #1

Open
wants to merge 24 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*.user
*.userosscache
*.sln.docstates
/vendor/

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
Expand Down Expand Up @@ -348,3 +349,5 @@ MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

/vendor/
39 changes: 39 additions & 0 deletions Md/App.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace Md;

use Md\Controllers\IController;
use Md\Http\Http;
use Md\Http\IRouter;

/**
* MD MVC App Launcher
*
* Override handleController() to customize controllers loading
*
*/
class App
{
/**
* Run MVC App using IRouter
* @param IRouter $_router the IRouter object to use
*/
final static public function run(IRouter $_router): void
{
if(null !== ($c = static::handleController($_router))) {
Http::response($c->handleRequest());
}

Http::notFound('invalid controller');
}

/**
* Load Controller from given IRouter
* @param IRouter $_router the IRouter object to use
* @return IController|null the loaded IController or null if not found
*/
static protected function handleController(IRouter $_router): ?IController
{
return $_router->getController();
}
}
78 changes: 78 additions & 0 deletions Md/Controllers/Controller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

namespace Md\Controllers;

use Md\Db\IRepository;
use Md\Db\Repository;
use Md\Http\IRequest;
use Md\Http\IResponse;
use Md\Http\IRouter;
use Md\Http\Response;
use Md\Views\View;

/**
* Abstract Class Controller
*/
abstract class Controller implements IController
{
/** @var IRouter $router The router used by current App */
protected IRouter $router;

/** @var IRequest $request The HTTP request extracted from $router */
protected IRequest $request;

/** @var IResponse $response The HTTP response object */
protected IResponse $response;

/** @var null|IRepository $repo The Repository to use or null if no repository */
protected ?IRepository $repo;

protected bool $view;

public function __construct(IRouter $_router)
{
$this->router = $_router;
$this->request = $_router->getRequest();
$this->response = new Response();
$this->repo = null;
$this->view = false;
$this->init();
}

protected function init()
{

}

public function handleRequest(): IResponse
{
$a = $this->request->getAction();

if(!method_exists($this, $a)) {
return $this->response->setCode(404)->addData('error', 'Invalid Action');
}

$this->{$a}();

if($this->view === false) {
return $this->response;
}

$layout = new View($this->router->getPath().'Views/');
$layout->setFile('_layout');
$layout->setChild('page', $this->router->getViewPath());
$this->response->setView($layout);
return $this->response;
}

/**
* Set Generic Repository from table name and primary key name
* Remember to open the connection with DbContext before use any repo
*/
public function setRepository(string $_table, string $_pk)
{
$this->repo = new Repository($_table, $_pk);
}

abstract public function indexAction(): void;
}
12 changes: 12 additions & 0 deletions Md/Controllers/IController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Md\Controllers;


use Md\Http\IResponse;


interface IController
{
public function handleRequest(): IResponse;
}
189 changes: 189 additions & 0 deletions Md/Db/DbContext.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
<?php

namespace Md\Db;

use PDO;
use PdoStatement;
use Exception;

/** Class Db
*
* @author MDevoldere
* @version 1.0.1
* @access public
*/
class DbContext implements IDbContext
{

/** @var IDbContext[] $context */
static protected array $context = [];

static public function getContext(string $_context = 'default') : ?IDbContext
{
return self::$context[$_context] ?? null;
}

static public function setContext(array $c = [], string $_context = 'default'): ?IDbContext
{
try {

if (empty($c['db_type']) || empty($c['db_dsn'])) {
exit('Db Error 0');
return null;
}

switch ($c['db_type']) {
case 'mysql':
self::$context[$_context] = new DbContext(new PDO(
$c['db_dsn'],
($c['db_user'] ?? 'root'),
($c['db_pass'] ?? ''),
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
));
break;
case 'sqlite':
$pdo = new PDO($c['db_dsn'], 'charset=utf8');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->exec('pragma synchronous = off;');
self::$context[$_context] = new DbContext($pdo);
break;
default:
exit('Db Error 1');
break;
}

return self::getContext($_context);

} catch (Exception $e) {
exit('Db Error 10');
}
}


/**
* Retourne le jeu de résultat d'une requête SELECT exécutée
* @param PDOStatement $stmt Le jeu de résultat de la requête exécutée
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1ère ligne trouvée
* @return array le jeu de résultat ou un tableau vide
*/
static protected function fetchStmt(PDOStatement $stmt, bool $_all = false): array
{
$r = (($_all === false) ? $stmt->fetch() : $stmt->fetchAll());
$stmt->closeCursor();
return (!empty($r) ? $r : []);
}


/** @var PDO $db Représente une connexion vers une base de données */
protected ?PDO $pdo = null;

protected function __construct(PDO $_pdo)
{
$this->pdo = $_pdo;
}

/** Exécute une requête de lecture simple
* @param string $_query La requête SQL à exécuter
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1ère ligne trouvée
* @return mixed Le jeu de résultat ou empty si aucun résultat
*/
public function query(string $_query, bool $_all = false): array
{
try {
return self::fetchStmt($this->pdo->query($_query), $_all);
} catch (Exception $e) {
exit('Db Error 11');
}
}

/** Exécute une requête de lecture paramétrée
* @param string $_query La requête à exécuter
* @param array $_values Les paramètres de la requête
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1er ligne trouvée
* @return mixed Le jeu de résultat ou empty si aucun résultat
*/
public function fetch(string $_query, array $_values = [], bool $_all = false): array
{
try {
$stmt = $this->pdo->prepare($_query);
return ($stmt->execute($_values) ? static::fetchStmt($stmt, $_all) : []);
} catch (Exception $e) {
exit('Db Error 100' . $e->getMessage());
}
}

/** Exécute une requête de lecture paramétrée et retourne toutes les lignes trouvées
* @param string $_query La requête à exécuter
* @param array $_values Les paramètres de la requête
* @return mixed Le jeu de résultat ou empty si aucun résultat
*/
public function fetchAll(string $_query, array $_values = []): array
{
return $this->fetch($_query, $_values, true);
}


/** Exécute une requête d'écriture paramétrée et retourne le nombre de lignes affectées
* @param string $_query La requête à exécuter
* @param array $_values Les paramètres de la requête
* @return int Le nombre de lignes affectées
*/
public function exec(string $_query, array $_values = []): int
{
try {
$stmt = $this->pdo->prepare($_query);

if ($stmt->execute($_values)) {
$r = $stmt->rowCount();
$stmt->closeCursor();
return $r;
}
return 0;
} catch (Exception $e) {
exit('Db Error 101');
}
}


/** Insère un nouvel élément
* @param array|Db $_values Le tableau de valeurs correspondant à la table courante
* @return int Le nombre de lignes affectées
*/
/*static public function insert(array $_values): int
{
$cols = \array_keys($_values);
$vals = (':' . \implode(', :', $cols));
$cols = \implode(',', $cols);

return static::exec("INSERT INTO " . static::$tableName . " (" . $cols . ") VALUES (" . $vals . ");", $_values);
}*/

/** Met à jour un élément
* @param array\Db $_values Le tableau de valeurs correspondant à la table courante. Doit contenir l'identifiant de la ligne à mettre à jour.
* @return int Le nombre de lignes affectées
*/
/*static public function update(array $_values): int
{
$cols = [];

foreach ($_values as $k => $v) {
$cols[$k] = ($k . '=:' . $k);
}

return static::exec("UPDATE " . static::$tableName . " SET " . \implode(', ', $cols) . " WHERE " . static::$pkName . "=:" . static::$pkName . ";", $_values);
}*/

/** Supprime un élément
* @param int $_id L'identifiant de la ligne à supprimer
* @return int Le nombre de lignes affectées
*/
/*static public function delete($_id): int
{
return static::exec("DELETE FROM " . static::$tableName . " WHERE " . static::$pkName . "=:id;", [':id' => $_id]);
}*/
}
41 changes: 41 additions & 0 deletions Md/Db/IDbContext.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace Md\Db;

/** Interface IDbContext
*
* @author MDevoldere
* @version 1.0.0
* @access public
*/
interface IDbContext
{
/** Exécute une requête de lecture simple
* @param string $_query La requête SQL à exécuter
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1ère ligne trouvée
* @return array Le jeu de résultat ou empty si aucun résultat
*/
public function query(string $_query, bool $_all = false): array;

/** Exécute une requête de lecture paramétrée
* @param string $_query La requête à exécuter
* @param array $_values Les paramètres de la requête
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1er ligne trouvée
* @return array Le jeu de résultat ou empty si aucun résultat
*/
public function fetch(string $_query, array $_values = [], bool $_all = false): array;

/** Exécute une requête de lecture paramétrée et retourne toutes les lignes trouvées
* @param string $_query La requête à exécuter
* @param array $_values Les paramètres de la requête
* @return array Le jeu de résultat ou empty si aucun résultat
*/
public function fetchAll(string $_query, array $_values = []): array;

/** Exécute une requête d'écriture paramétrée
* @param string $_query La requête à exécuter
* @param array $_values Les paramètres de la requête
* @return int Le nombre de lignes affectées
*/
public function exec(string $_query, array $_values = []): int;
}
Loading