Aller au contenu principal
Version: 5.x

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 :

  1. RequĂȘte HTTP : L'utilisateur envoie une requĂȘte via son navigateur ou une API.
  2. Request : Le framework capture cette requĂȘte et extrait les donnĂ©es nĂ©cessaires (URL, paramĂštres, corps, etc.).
  3. Kernel : Le Kernel est le cƓur du framework. Il :
  • Charge les fichiers de configuration situĂ©s dans le dossier config (comme config/database.php).
  • Initialise les modules nĂ©cessaires Ă  l'application.
  1. Application : Elle dĂ©marre le Kernel et prĂ©pare l'environnement pour traiter la requĂȘte.
  2. Routeur :
  • Le routeur dĂ©tecte la route correspondant Ă  la requĂȘte (par exemple, /users/42 ou /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.
  1. Middleware : Les middlewares effectuent des traitements spécifiques, comme vérifier l'authentification ou valider les données.
  2. 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).
  3. 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.
  4. 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.).
  5. 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 :

routes/app.php
$app->get('/users/:id', 'UserController::show');
$app->post('/api/login', 'AuthController::login');
astuce

Ici :

  • La requĂȘte GET /users/42 est associĂ©e Ă  la mĂ©thode show du UserController.
  • La requĂȘte POST /api/login est associĂ©e Ă  la mĂ©thode login du AuthController.

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​

astuce

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 container
  • run() — 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 :

config/database.php
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

app/Kernel.php
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​

Résumé
  • 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 config et 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.