, (*1)
Framework PHP élégant, simple, léger, plaisant et flexible, (*2)
, (*3)
Philosophie
Bienvenue dans le Framework Zephyrus! Ce framework est fondĂ© sur un modĂšle pĂ©dagogique en s'orientant sur une structure MVC simple, une approche de programmation flexible laissant place Ă une extensibilitĂ© pour tous types de projet, une forte considĂ©ration pour la sĂ©curitĂ© applicative et une libertĂ© de dĂ©veloppement. Le tout offert depuis un noyeau orientĂ©-objet Ă©lĂ©gant favorisant l'Ă©criture d'un code de qualitĂ© propre et maintenable. DĂ©veloppement avec une philosophie de maintenir un plaisir Ă programmer en n'Ă©tant pas rigoureusement strict sur une utilisation figĂ©e oĂč tout doit passer par une configuration et y ĂȘtre limitĂ©. Zephyrus s'insĂšre Ă mi-chemin entre les plus petits frameworks et les monstres pour ainsi rĂ©pondre aux besoins de la plupart des projets., (*4)
Quelques caractéristiques générales
- Une structure de projet simple et intuitive basée sur une architecture Model-View-Controller.
- Traitement des vues avec le préprocesseur HTML Pug nativement intégré ou simplement du PHP natif.
- Approche pédagogique pour la conception élégante de classes et favorise une rétrocompatibilité avec les fonctionnalités natives de PHP comme l'utilisation des super-globales, de la session et autres.
- Routeur de requĂȘtes simple et flexible basĂ© sur des contrĂŽleurs incluant une intĂ©gration facile de middlewares dans le flux d'une requĂȘte et d'un contrĂŽleur du projet. Facilite la segmentation des responsabilitĂ©s et la lecture d'une chaĂźne d'exĂ©cution.
- Plusieurs mĂ©canismes de sĂ©curitĂ© intĂ©grĂ©s tel que les entĂȘtes CSP, les jetons CSRF, protection XSS, dĂ©tection d'intrusion basĂ© sur le projet (_PHPIDS_), mĂ©canisme d'authorisation et plus encore!
- Philosophie d'accĂšs aux donnĂ©es depuis des courtiers manuellement dĂ©finis offrant un contĂŽle complet sur la construction des requĂȘtes SQL et, par consĂ©quent, une facilitĂ© de maintenance et d'optimisation.
- Approche simple pour intĂ©grer des recherches, tris et pagination sur les requĂȘtes manuelles.
- SystÚme de validation de formulaires élégant et facilement extensible offrant une multitude de rÚgles nativement sur les nombres, les chaßnes, les fichiers téléversés, les dates, etc.
- Moteur unique simple et optimisé pour la gestion des chaßnes de caractÚres depuis une structure JSON, le tout facilement organisé pour offrir une internationalisation.
- Configuration dâun projet rapide et flexible permettant des paramĂštres personnalisĂ©es utilisables facilement.
- Hautement extensibles facilement grùce à sa compatibilité avec les modules Composer.
- Plusieurs utilitaires rapides : cryptographie, validations, systÚme de fichiers, gestionnaire d'erreurs, transport de messages, etc.
- Et plus encore !
Installation
Zephyrus nĂ©cessite PHP 8.2 ou plus. PrĂ©sentement, supporte uniquement Apache comme serveur web (pour un autre type de serveur, il suffirait dâadapter les fichiers .htaccess). Le gestionnaire de dĂ©pendance Composer est Ă©galement requis. La structure rĂ©sultante de lâinstallation contient plusieurs exemples pour faciliter les premiers pas., (*5)
Option 1 : Installation depuis composer (recommandé)
$ composer create-project zephyrus/framework <PROJECT_NAME>
Option 2Â : Depuis une archive
$ mkdir <PROJECT_NAME>
$ cd <PROJECT_NAME>
$ wget https://github.com/dadajuice/zephyrus-framework/archive/vx.y.z.tar.gz
$ tar -xvf vx.y.z.tar.gz --strip 1
$ composer install
Option 3 : Depuis les sources (version de développement pour faire un PR par exemple)
$ git clone https://github.com/dadajuice/zephyrus-framework.git
$ composer install
Intégration avec Apache
Une fois le projet installé, il suffit d'ajouter un entré dans vos vhost qui pointe vers le répertoire /public du
projet., (*6)
<VirtualHost *:80>
ServerName <HOST or IP>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/<PROJECT_NAME>/public
<Directory /var/www/>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Utilisation
Exemple 1 : Obtenir une liste et un détail depuis la base de données (simple)
app/Models/Brokers/ClientBroker.php, (*7)
<?php namespace Models\Brokers;
class ClientBroker extends Broker
{
public function findAll(): array
{
return $this->select("SELECT * FROM client");
}
public function findById($clientId): ?\stdClass
{
return $this->selectSingle("SELECT * FROM client WHERE client_id = ?", [$clientId]);
}
}
app/Controllers/ExampleBroker.php, (*8)
<?php namespace Controllers;
use Models\Brokers\ClientBroker;use Zephyrus\Network\Router\Get;
class ExampleController extends Controller
{
#[Get("/clients")]
public function index()
{
$broker = new ClientBroker();
return $this->json(['clients' => $broker->findAll()]);
}
#[Get("/clients/{id}")]
public function read($clientId)
{
$broker = new ClientBroker();
$client = $broker->findById($clientId);
if (is_null($client)) {
return $this->abortNotFound();
}
return $this->json(['client' => $client]);
}
}
Exemple 2 : Traitement d'une insertion avec validation
<?php namespace Controllers;
use Models\Brokers\UserBroker;
use Zephyrus\Application\Rule;use Zephyrus\Network\Router\Post;
class ExampleController extends Controller
{
#[Post("/users")]
public function insert()
{
// Construire un objet Form depuis les donnĂ©es de la requĂȘte
$form = $this->buildForm();
// Appliquer une série de rÚgles de validation sur les champs nécessaires. Il existe une grande quantité
// de validations intégrées dans Zephyrus. Consulter les Rule:: pour les découvrir.
$form->field('firstname', [Rule::required("Firstname must not be empty")]);
$form->field('lastname', [Rule::required("Lastname must not be empty")]);
$form->field('birthdate', [Rule::date("Date is invalid")]);
$form->field('email', [
Rule::required("Email must not be empty"),
Rule::email("Email is invalid")
]);
$form->field('password', [Rule::passwordCompliant("Password does not meet security requirements")]);
$form->field('password_confirm', [Rule::sameAs("password", "Password doesn't match")]);
$form->field('username', [
Rule::required("Username must not be empty"),
new Rule(function ($value) {
return $value != "admin";
}, "Username must not be admin!")
]);
// Si la vérification échoue, retourner les messages d'erreur avec leur champs
if (!$form->verify()) {
return $this->json($form->getErrors());
}
// Effectuer le traitement si aucune erreur n'est détectée (dans ce cas, ajouter l'utilisateur depuis
// un courtier et obtenir le nouvel identifiant).
$clientId = (new UserBroker())->insert($form->buildObject());
// Retourner au client l'identifiant du nouvel utilisateur
return $this->json(['client_id' => $clientId]);
}
}
Contribution
Remerciements â€ïž
- Ătudiants de la Technique informatique du CĂ©gep de Sorel-Tracy ainsi que les employĂ©s de Onirique pour leur support et idĂ©es d'amĂ©liorations.
- Auteurs de PHPIDS pour avoir donné leur permission pour l'inclusion de certaines parties de leur code pour concevoir le module de détection d'intrusion.
Sécurité
Veuillez communiquer en privé pour tout problÚme pouvant affecter la sécurité des applications créées avec ce framework., (*9)
Bogues et fonctionnalités
Pour rapporter des bogues, demander lâajout de nouvelles fonctionnalitĂ©s ou faire des recommandations, nâhĂ©sitez pas Ă utiliser lâoutil de gestion des problĂšmes de GitHub., (*10)
Développement
Vous pouvez contribuer au développement de Zephyrus en soumettant des PRs., (*11)
License
MIT (c) David Tucker, (*12)