https://github.com/CodeExp/simple-php-boilerplate
- Concepts - Séparation des idées - Backend - Frontend
- Avantages
- Exigences en matière de connaissances
- Vue d'ensemble - Configuration centralisée - Gestion des routes - Validation facile - Protection CSRF - Mot de passe sécurisé - Protection contre les injections Sql
- Classes de base (Core) - Classe Config - Classe Cookie - Database Classe - Classe Hash - Fonctions Helper - Fichier Init.php pour l'Initialisation - Classe Input - Classe Password - Classe Redirect - Classe Session
- Classes Utilies - Classe Token - Classe Validation - Classe Contact
- Classes de Modèles - Classe User - Autres classes de modèles - Diagramme de Classes de Modèles
Le dossier de l'application app
est composé de dossiers frontend et backend, qui séparent la conception frontend (les vues) et la logique backend (les contrôleurs et les classes de modèles).
Le dossier medias
contient les images et documents utilisés dans l'application.
Les différentes pages sont définies dans app/init/routes.php
. C'est dans ce fichier que l'ont défini les urls de l'application ainsi que les contrôleurs et les contenus visuels qui seront appelés pour contruire la page.
Le dossier "app" contient quatres dossiers :
frontend
: la logique de l'application, c'est-à-dire le coeur, les fichiers d'initialisation, les contrôleurs et les classes de modèles.backend
: les vues de l'application, c'est à dire les fichiers qui contiennent le code HTML ainsi que les fichiers css et js.setup
: les fichiers pour l'installation de l'application (notamment une sauvegarde de la base de données avec sa structure et les données pour l'année 2023).vendor
: ce sont les librairies externes utilisées par l'application.
Le dossier backend contient les dossiers controllers
, init
, classes
, core
. Les dossiers controllers
et init
sont de niveau 2, Classes est de niveau 1, et Core est de niveau 0. C'est donc dans le dossier controllers que vous placerez votre logique qui se connecte à vos pages frontales. Ensuite, les dossiers classes
sont les objets ou les outils qui sous-tendent la logique des fichiers de controllers. Enfin, le dossier core
représente les idées abstraites qui se cachent derrière le dossier des classes. Et c'est tout.
Le dossier frontend
contient les dossiers assets
, includes
, templates
et pages
qui ont été découpés pour réutiliser votre design et vos codes. Comme le dossier assets où se trouvent les css, js, images, le dossier includes où sont séparés les headers, navbar, messages, footer et le dossier pages où se trouvent toutes les pages de l'application.
Le dossier template, quant à lui, inclus les vues spécifiques des pages (de l'entité Page) avec un design spécifique.
- Organiser la structure des fichiers
- Haute sécurité
- Code Réutilisable
<?php
// app/backend/init/config.php
$GLOBALS['config'] = array(
'app' => array(
'name' => 'AppName',
),
'mysql' => array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => '',
'db_name' => 'php_boilerplate'
),
...
)
<?php
// app/backend/core/Database.php
require_once 'app/backend/init/config.php';
...
$pdo = new PDO('mysql:host='.Config::get('mysql/host').';'. // 127.0.0.1
'dbname='.Config::get('mysql/db_name'), // php_boilerplate
Config::get('mysql/username'), // root
Config::get('mysql/password') // ''
);
// app/backend/init/routes.php
<?php
$router = new Router();
$router->addRoute('/accueil.php', function() use ($indexation, $user) {
Redirect::to('/');
});
...
$router->addRoute('/', function () use ($indexation, $user) {
require_once BACKEND_CONTROLLER . 'accueil.php';
require_once FRONTEND_INCLUDE . 'header.php';
require_once FRONTEND_INCLUDE . 'admin-navbar.php';
require_once FRONTEND_INCLUDE . 'navbar.php';
require_once FRONTEND_INCLUDE . 'messages.php';
require_once FRONTEND_PAGE . 'accueil.php';
require_once FRONTEND_INCLUDE . 'newsletter.php';
require_once FRONTEND_INCLUDE . 'map.php';
require_once FRONTEND_INCLUDE . 'partenaires.php';
require_once FRONTEND_INCLUDE . 'footer.php';
});
...
$router->setDefaultHandler(function ($indexation, $user) {
require_once BACKEND_CONTROLLER . 'page/afficher.php';
require_once FRONTEND_INCLUDE . 'header.php';
require_once FRONTEND_INCLUDE . 'admin-navbar.php';
require_once FRONTEND_INCLUDE . 'navbar.php';
require_once FRONTEND_PAGE . 'page/afficher.php';
require_once FRONTEND_INCLUDE . 'partenaires.php';
require_once FRONTEND_INCLUDE . 'footer.php';
});
<?php
// app/backend/controllers/update-account.php
require_once 'app/backend/classes/Validation.php';
$validate = new Validation();
$validation = $validate->check($_POST, array(
'username' => array(
'required' => true,
'min' => 2,
'unique' => 'users'
),
'current_password' => array(
'required' => true,
'min' => 6,
'verify' => 'password'
),
'new_password' => array(
'optional' => true,
'min' => 6,
'bind' => 'confirm_new_password'
)
'confirm_new_password' => array(
'optional' => true,
'min' => 6,
'match' => 'new_password',
'bind' => 'new_password',
),
));
if ($validate->passed()) {
// Awesome Logic...
} else {
echo $validate->$error(); // First error message.
foreach ($validate->errors() as $error) // All error messages.
{
echo $error;
}
}
...
<?php
// 'app/frontend/pages/update-account.php';
require_once 'app/backend/classes/Token.php';
...
<input type="hidden" name="csrf_token" value="<?php echo Token::generate(); ?>">
<input type="submit" value="Register me">
...
<?php
// 'app/backend/controllers/update-account.php';
require_once 'app/backend/core/Input.php';
require_once 'app/backend/classes/Token.php';
...
if (Token::check(Input::get('csrf_token'))) {
// Do validation stuff...
}
...
<?php
// app/backend/controllers/register.php
require_once app/backend/core/Password.php
...
$user->create(array(
...
'password' => Password::hash(Input::get('password')),
...
));
...
<?php
// app/backend/controllers/register.php
require_once app/backend/classes/Validation.php
...
if (Password::check($value, $this->_user->data()->password)) {
// Do awesome stuff...
}
...
<?php
// app/backend/core/Database.php
...
$this->_pdo = new PDO('mysql:host='.Config::get('mysql/host')...);
...
$this->_query->bindvalue($x, $param);
...
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
...
Classe pour obtenir les informations du fichier de configuration
$tokenName = Config::get('session/token_name');
<?php
require_once 'app/backend/core/Cookie.php';
// vérifier si le nom du cookie existe
if (Cookie::exists(Config::get('remember/cookie_name'))) {
// ...
}
// obtenir la valeur du cookie
$cookie_value = Cookie::get(Config::get('remember/cookie_name'));
// supprimer la valeur du cookie
$cookie_value = Cookie::delete(Config::get('remember/cookie_name'));
<?php
require_once 'app/backend/core/Database.php';
// Établir une connexion
$database = Database::getInstance();
// Obtenir les données de la base de données.
// $database->get($table, $where = array())
$database->get('users', array('id', '=', '13'));
// Insérer les données dans la base de données.
// $database->insert($table, $fields = array())
$database->insert('users', array(
'username' => 'johnny123',
'password' => Password::hash('secret'),
'name' => 'JohnDoe',
'joined' => date('Y-m-d H:i:s')
));
// Mettre à jour les données de la base de données.
// $database->update($table, $id, $fields = array())
$database->update('users', '13', array(
'username' => 'newusernname',
'password' => Password::hash('newsecret'),
'name' => 'newname',
));
// Supprimer les données de la base de données.
// $database->delete($table, $where = array())
$database->delete('users', array('id', '=', '13'));
// Obtenir les premières données de la base de données.
$database->first();
// Compter les données de la base de données.
$database->count();
// Renvoie un résultat des données de l'objet à partir de la base de données.
$database->results();
// Obtenir l'erreur de la requête.
$database->error();
<?php
require_once 'app/backend/core/Hash.php';
// Effectuer un hachage sur la base de l'algorithme indiqué dans la configuration.
$hash = Hash::make('string');
// Générer un hachage unique.
$hash = Hash::unique();
<?php
require_once 'app/backend/core/Helpers.php';
...
escape('string'); // convertir les entités html en guillemets.
escape_decode('string');// fonction inverse de escape()
autoload($classname); // pour inscrire automatiquement toutes les classes.
cleaner('string'); // supprimer le /_/ puis rendre supérieure la chaîne.
appName(); // Affichage du nom de l'application
debug('string', 'int'); // fonction debug qui a été codé par Catherine
norobotmail('int'); // fonction
replacemail('string');; // fonction pour afficher les adresses emails de manière sécurisée
test_input('string'); // fonction jerem pour contrôle de l'input mail
slugify('string'); // fonction pour créer automatiquement les slugs ou noms utilisés dans l'url
Fichier principal où la session est initialisée et les fichiers sont chargés
<?php
session_start();
require_once 'app/backend/init/config.php';
require_once 'app/backend/core/Helpers.php';
spl_autoload_register("autoload");
require_once 'app/backend/init/cookie.php';
require_once 'app/backend/init/user.php';
Classe pour récupérer les valeurs obtenues en $_GET ou en $_POST
<?php
require_once 'app/backend/core/Input.php';
// Vérifier si la requête est vide, par exemple post ou get.
if (Input::exists()) {
// Do some validation..
}
// Obtenir la valeur de cette demande.
Input::get('csrf_token');
<?php
require_once 'app/backend/core/Password.php';
// Générer un hachage basé sur les configurations.
$hash_password = Password::hash('secret');
// Vérifier le hash s'il a besoin d'être rehashé
// Cela se produira si vous avez changé la configuration du mot de passe.
if (Password::rehash('hash')) {
// Hash the password..
}
// Vérifier le mot de passe à partir du hachage stocké dans la base de données.
if (Password::check('secret', 'hash')) {
// Do awesome stuff...
}
// Obtenir les informations sur le hachage. Par exemple, le nom de l'algo, le coût ou le sel.
$password_info = Password::getInfo('hash');
<?php
require_once 'app/backend/core/Redirect.php';
// Rediriger l'utilisateur à partir de l'emplacement spécifié.
Redirect::to('/');
<?php
require_once 'app/backend/init/config.php';
require_once 'app/backend/core/Session.php';
// Vérifier le nom de la session s'il existe dans le serveur.
if (Session::exists(Config::get('session/session_name'))) {
// Do awesome stuff...
}
// Obtenir la valeur du nom de la session.
$session_value = Session::get(Config::get('session/session_name'));
// Supprimer la valeur du nom de la session.
Session::delete(Config::get('session/session_name'));
// Définir un message flash à afficher à l'utilisateur
// Utiliser ceci si l'on veut envoyer un message à l'utilisateur en fonction de son opération
// flash($message-name, $message)
Session::flash('register-success', 'Thanks for registering! You can login now.');
<?php
require_once 'app/backend/classes/Token.php';
// Générer un jeton pour la protection csrf.
$csrf_token = Token::generate();
// Vérifier si le jeton est égal au jeton de l'utilisateur.
if (Token::check($token)) {
// Faire plus de validation...
}
<?php
require_once 'app/backend/classes/Validation.php'
// Créez une nouvelle instance de Validation.
$validate = new Validation();
// Règles disponibles : Notes :
// optional => true, 'peut être nul ou sans valeur'
// required => true, 'ne peut être nul ou sans valeur'
// bind => 'input_name', 'établir une connexion avec d'autres entrées'
// min => 'any_number', 'la longueur minimale de cette entrée'
// max => 'any_number', 'la longueur maximale de cette entrée'
// match => 'input_name', 'vérifier si l'entrée correspond à celle d'un autre'
// email => true, 'Vérifier si l'adresse électronique saisie est valide'
// alnum => true, 'vérifier si l'entrée est alpha numérique'
// unique => 'table_name', 'vérifier si l'entrée est unique dans la table indiquée'
// verify => 'password', 'uniquement en mot de passe, vérifiez l'état actuel de la'
$validation = $validate->check($_POST, array(
'username' => array(
'required' => true,
'unique' => 'users',
'min' => 2,
'max' => 20,
'matches' => 'password',
'alnum' => true
),
));
// Vérifier s'il y a des erreurs.
if ($validate->passed()) {
// Requête à la base de données...
} else {
// Pour le premier message d'erreur.
// echo $validate->$error();
// Pour tous les messages d'erreur.
foreach ($validate->errors() as $error)
{
echo $error;
}
}
Classe utilisée pour l'envoi de mails à partir du formulaire de contact.
Ensemble des classes spécifiques aux fonctionnalités de l'application
Tables associées : users, users_session et groups.
<?php
require_once 'app/backend/classes/User.php'
// Créer une instance pour l'utilisateur.
$user = new User();
// Note : Ne vous laissez pas abuser...
// La logique est la même dans la requête de la base de données.
// Il est simplement encapsulé dans la classe d'utilisateur.
// Créer une donnée utilisateur.
$user->create(array(
'username' => Input::get('username'),
'password' => Password::hash(Input::get('password')),
'name' => Input::get('name'),
'joined' => date('Y-m-d H:i:s'),
));
// Mettre à jour les données de l'utilisateur.
$user->update(array(
'username' => Input::get('username'),
'password' => Password::hash(Input::get('password')),
'name' => Input::get('name'),
'joined' => date('Y-m-d H:i:s'),
), '13');
// Trouver l'utilisateur s'il existe.
$user->delete('13'); // supprime l'utilisateur
// Trouver l'utilisateur s'il existe.
$user->find('13'); // renvoie vrai ou faux
$user->find('johnny123'); // renvoie vrai ou faux
// Lister les utilisateurs
$user->findAllEmails() //renvoie l'ensemble des adresse emails
$user->findAll() //renvoie l'ensemble des utilisateurs
// Connexion de l'utilisateur.
// Le troisième argument permet de vérifier si l'utilisateur souhaite se souvenir.
$user->login('johnny123', 'secret', true);
// Vérifier si l'utilisateur existe.
$user->exists();
// Déconnexion de l'utilisateur.
// Supprimer la session et le cookie qui y sont attachés.
$user->logout();
// Obtenir les données de l'utilisateur sous forme d'objet.
$user->data();
$user->data()->username; // 'johnny123'
$user->data()->name; // 'JohnDoe'
// Vérifier si l'utilisateur s'est connecté.
$user->isLoggedIn(); // Renvoyer vrai ou faux.
// Supprimer les données de la base de données.
$user->deleteMe();
- ...
- SiteInfo (site_info)