Concept et Architecture
Introductionâ
BowPHP est un framework PHP lĂ©ger, conçu pour offrir une structure claire et modulaire. Lorsqu'une requĂȘte arrive, elle suit un chemin bien dĂ©fini appelĂ© cycle de vie d'une requĂȘte. Ce cycle est organisĂ© pour sĂ©parer les responsabilitĂ©s, rendre le code facile Ă maintenir et amĂ©liorer les performances.
Le cycle de vie d'une requĂȘte expliquĂ©â
Chaque requĂȘte passe par plusieurs Ă©tapes avant de gĂ©nĂ©rer une rĂ©ponse pour l'utilisateur.
Voici les étapes principales :
- RequĂȘte HTTP : L'utilisateur envoie une requĂȘte via son navigateur ou une API.
- Request : Le framework capture cette requĂȘte et extrait les donnĂ©es nĂ©cessaires (URL, paramĂštres, corps, etc.).
- Kernel : Le Kernel est le cĆur du framework. Il :
- Charge les fichiers de configuration situés dans le dossier
config(commeconfig/database.php). - Initialise les modules nécessaires à l'application.
- Application : Elle dĂ©marre le Kernel et prĂ©pare l'environnement pour traiter la requĂȘte.
- Routeur :
- Le routeur dĂ©tecte la route correspondant Ă la requĂȘte (par exemple,
/users/42ou/api/login). - Il associe cette route à un contrÎleur et une méthode spécifique, définis directement dans le code des routes.
- Si des middlewares sont définis pour cette route, ils sont exécutés avant d'appeler le contrÎleur.
- Middleware : Les middlewares effectuent des traitements spécifiques, comme vérifier l'authentification ou valider les données.
- ContrÎleur : Une fois la route validée, le contrÎleur exécute la logique métier (par exemple, récupérer des données ou effectuer une action).
- ModÚle : Si des données sont nécessaires, le modÚle interagit avec la base de données pour les récupérer ou les mettre à jour.
- Vue : Le contrÎleur renvoie les données récupérées au composant Vue, qui génÚre le contenu final (HTML, JSON, etc.).
- Réponse HTTP : La réponse est envoyée à l'utilisateur.
Le rĂŽle du routeur en dĂ©tailâ
Le routeur est un composant clĂ© de BowPHP. Il agit comme une "boussole" qui oriente chaque requĂȘte vers le bon contrĂŽleur et la bonne mĂ©thode.
DĂ©tection de la routeâ
Le routeur examine l'URL de la requĂȘte et dĂ©termine quelle route correspond. Les routes sont dĂ©finies dans des fichiers dĂ©diĂ©s.
Exemple de définition de route :
$app->get('/users/:id', 'UserController::show');
$app->post('/api/login', 'AuthController::login');
Ici :
- La requĂȘte
GET /users/42est associĂ©e Ă la mĂ©thodeshowduUserController. - La requĂȘte
POST /api/loginest associée à la méthodeloginduAuthController.
Bow supporte aussi le routage par attributs PHP 8, qui permet de déclarer les routes directement sur la classe contrÎleur sans fichier de routes centralisé :
use Bow\Router\Attributes\{Controller, Get};
#[Controller(prefix: '/api/users', middleware: ['auth'])]
final class UserController
{
#[Get('/:id', name: 'show', where: ['id' => '\d+'])]
public function show(int $id) { /* ... */ }
}
// Dans routes/app.php
$app->register(UserController::class);
Voir Routage > Routage par attributs pour le détail des attributs disponibles.
Association au contrĂŽleurâ
Une fois la route détectée, le routeur :
- Valide les paramĂštres de l'URL (comme
:id). - Exécute les middlewares définis pour cette route (s'il y en a).
- Appelle le contrÎleur et la méthode associés à la route.
Une architecture modulaireâ
BowPHP repose sur une architecture modulaire. Chaque module est indépendant, possÚde sa propre configuration et remplit un rÎle spécifique. Cela rend l'application facile à gérer et à étendre. Le routeur en est un exemple ; le module Database, qui gÚre les connexions à la base de données, en est un autre.
Le contrat : Bow\Configuration\Configurationâ
Tous les modules suivent le mĂȘme contrat : chacun expose une classe qui
étend Bow\Configuration\Configuration et implémente deux méthodes :
create(Loader $config)â dĂ©clare les liaisons dans le containerrun()â dĂ©marre le module (utile pour les ressources eager)
Le Kernel (votre app/Kernel.php, qui étend Bow\Configuration\Loader)
liste ces providers dans sa méthode configurations(). Au démarrage, le
Kernel les instancie, charge les fichiers config/*.php, puis appelle
create() puis run() sur chacun.
Exemple : Le module Databaseâ
Prenons le cas du module Database, qui gÚre les connexions à la base de données :
Fichier de configuration : config/database.php
Ce fichier contient les paramÚtres nécessaires pour se connecter à la base de données. Voici un exemple simple :
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'bowphp_app',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
],
],
];
Classe Bow\Database\DatabaseConfiguration
Cette classe (qui étend Bow\Configuration\Configuration) lit config/database.php,
configure les connexions PDO et expose db / database dans le container.
Enregistrement dans le Kernel
namespace App;
use Bow\Configuration\Loader;
use Bow\Database\DatabaseConfiguration;
class Kernel extends Loader
{
public function configurations(): array
{
return [
DatabaseConfiguration::class,
// ... d'autres providers (Cache, Mail, Queue, etc.)
];
}
}
Au démarrage, le Kernel charge config/database.php, instancie
DatabaseConfiguration puis appelle ses méthodes create() et run(). La
connexion est alors prĂȘte Ă ĂȘtre utilisĂ©e par les contrĂŽleurs, les modĂšles
Barry et les autres composants.
Visualisation avec un diagrammeâ
Voici une reprĂ©sentation visuelle pour mieux comprendre le cycle de vie d'une requĂȘte et l'intĂ©gration modulaire (exemple avec Database) :
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Framework Bow â
â â
â âââââââââââââââ ââââââââââââ ââââââââââââââ âââââââââââââââââââ â
â â Request âââââ¶â Kernel âââââ¶â Routeur âââââ¶â Middleware â â
â âââââââââââââââ ââââââââââââ ââââââââââââââ âââââââââââââââââââ â
â âČ â â â
â â â Charge les â â
â â â modules ⌠â
â â â âââââââââââââââââââ â
â â ⌠â ContrĂŽleur â â
â â ââââââââââââââ âââââââââââââââââââ â
â â â Config â â â
â â ââââââââââââââ â â
â â ⌠â
â âââââââââââââââ âââââââââââââââââââ â
â â RĂ©ponse ââââââââââââââââââââââââââââââââââââââ¶â ModĂšle â â
â â HTTP â âââââââââââââââââââ â
â âââââââââââââââ â â
â âČ â â
â â ⌠â
â â âââââââââââââââ âââââââââââââââââââ â
â âââââââââââ Vue ââââââââââââââââââââââââ Base de donnĂ©es â â
â âââââââââââââââ âââââââââââââââââââ â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Flux : Request â Kernel â Routeur â Middleware â ContrĂŽleur â ModĂšle â Vue â RĂ©ponse
RĂ©sumĂ© des points importantsâ
- Cycle de vie structurĂ© : Une requĂȘte suit un chemin prĂ©cis (Request â Kernel â Routeur â Middleware â ContrĂŽleur â ModĂšle â Vue â RĂ©ponse).
- RĂŽle du routeur : Le routeur dĂ©tecte la route correspondant Ă la requĂȘte et appelle le contrĂŽleur et la mĂ©thode associĂ©s.
- Kernel : Orchestre le chargement des configurations depuis le dossier
configet initialise les modules. - Modularité : Chaque composant (routeur, base de données, etc.) est indépendant, ce qui simplifie la gestion et améliore la maintenabilité.
Merci aux contributeursâ
Merci d'avoir envisagé de contribuer à BowPHP ! Le guide de contribution se trouve dans la documentation.
Il manque quelque chose ?
Si vous rencontrez des problÚmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.