Skip to content

Commit

Permalink
feat: add app concept docs
Browse files Browse the repository at this point in the history
  • Loading branch information
papac committed Jan 20, 2025
1 parent c78e29e commit 0b1a545
Show file tree
Hide file tree
Showing 16 changed files with 411 additions and 138 deletions.
133 changes: 113 additions & 20 deletions docs/concept.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,45 +6,138 @@ title: "👨🏽‍💻 Concept et Architecture"
import SuggestionFeature from "@site/src/components/Partials/SuggestionFeature";
import BugReportFeature from "@site/src/components/Partials/BugReportFeature";

# Bow Framework
## Comprendre le cycle de vie d’une requête dans BowPHP

<a href="https://bowphp.com" title="docs"><img src="https://img.shields.io/badge/docs-read%20docs-blue.svg?style=flat-square"/></a>
<a href="https://packagist.org/packages/bowphp/app" title="version"><img src="https://img.shields.io/packagist/v/bowphp/app.svg?style=flat-square"/></a>
<a href="https://github.com/bowphp/app/blob/master/LICENSE" title="license"><img src="https://img.shields.io/github/license/mashape/apistatus.svg?style=flat-square"/></a>
<a href="https://travis-ci.org/bowphp/app" title="Travis branch"><img src="https://img.shields.io/travis/bowphp/app/master.svg?style=flat-square"/></a>
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.

Bow est un framework PHP, écrit par **[Franck DAKIA](http://github.com/papac)** et autres contributeurs.
### Le cycle de vie d'une requête expliqué

L'objectif est de permettre aux débutants qui souhaitent travailler sur un plus large projet et comprendre le fonctionnement du **développement collaboratif** de s'y mettre avec aisance et faire de ce framework une référence dans la communauté PHP.
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.
4. **Application** : Elle démarre le Kernel et prépare l'environnement pour traiter la requête.
5. **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.
6. **Middleware** : Les middlewares effectuent des traitements spécifiques, comme vérifier l'authentification ou valider les données.
7. **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).
8. **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.
9. **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.).
10. **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 (souvent routes/web.php ou routes/api.php).

Exemple de définition de route :

```php
$app->get('/users/{id}', 'UserController@show');
$app->post('/api/login', 'AuthController@login');
```

:::note
Ici :
La requête `GET /users/42` est associée à la méthode show du contrôleur UserController.
La requête `POST /api/login` est associée à la méthode login du contrôleur AuthController.
:::

#### 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édant sa propre configuration et remplit un rôle spécifique. Cela rend l’application facile à gérer et à étendre. Le routeur est un exemple de cette approche modulaire. Un autre exemple est le module Database, qui gère les connexions à la base de données.

#### 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 :

```php title="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 est chargée de lire les paramètres du fichier `config/database.php` et d’établir une connexion à la base de données.

#### **Rôle du Kernel**
Au démarrage, le Kernel charge le fichier `config/database.php` à l’aide de `DatabaseConfiguration` défini dans `app/Kernel.php` et initialise une connexion à la base de données, prête à être utilisée par d’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**) :
Charge les configurations

Voici un diagramme mis à jour, mettant en évidence le rôle du routeur et l’intégration modulaire (exemple avec Database)

```mermaid
graph TD
A[Requête HTTP] -->|Entrée utilisateur| B[Routeur]
B -->|Associe une route| C[Contrôleur]
C -->|Appelle la logique métier| D[Modèle]
D -->|Interaction| E[(Base de données)]
C -->|Retourne des données| F[Vue]
F -->|Génère la réponse HTML| G[Réponse HTTP]
graph TB
A[Requête HTTP] -->|Entrée utilisateur| B[Request]
B -->|Passe la requête| C[Kernel]
C -->|Charge les modules| D[Routeur]
D -->|Vérifie la route et<br>appelle le contrôleur| E[Middleware]
E -->|Valide la requête<br>et continue| F[Contrôleur]
F -->|Exécute la logique métier| G[Modèle]
G -->|Interaction avec| H[(Base de données)]
F -->|Retourne les données| I[Vue]
I -->|Génère la réponse HTML/JSON| J[Réponse HTTP]
subgraph Framework BowPHP
B
C
D
E
F
G
I
end
```

### 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 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é.

## Contributing

Merci d'avoir envisagé de contribuer à Bow Framework ! Le guide de contribution se trouve dans la documentation.

- [Franck DAKIA](https://github.com/papac)
- [Merci aux collaborateurs](https://github.com/bowphp/app/graphs/contributors)

## Contact

- [Franck DAKIA](https://github.com/papac)
- [Thanks collaborators](https://github.com/bowphp/docs/graphs/contributors)

<BugReportFeature />
<SuggestionFeature />
10 changes: 5 additions & 5 deletions docs/service.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import SuggestionFeature from "@site/src/components/Partials/SuggestionFeature";

# Service

Les services sont des classes simple qui vous voulez injectées dans vos Controllers, dans d'autre services que peuvent nous permettre de découpler les logiquees et donc optimisé votre code source.
Vous pouvez aussi injectées des modèles dans vos services.
Les services sont des classes simples qui vous veulent injecter dans vos Controllers, dans d'autres services que peuvent nous permettre de découpler la logique et donc optimisé votre code source.
Vous pouvez aussi injecter des modèles dans vos services.

## Utilisation

Pour ajouter un service rien de plus simple que d'untilisé la commande suivante :
Pour ajouter un service rien de plus simple que d'utilisé la commande suivante :

```bash
php bow add:service UserService
Expand All @@ -36,15 +36,15 @@ class UserService

## Utilisation du service

Pour utiliser le service nous allons l'inject là ou nous voulons l'utiliser, dans notre cas dans un controller.
Pour utiliser le service, nous allons inject là ou nous voulons l'utiliser, dans notre cas dans un controller.

Lancer la commande suivante pour créer un nouveau controller

```bash
php bow add:controller UserController
```

Dans le controleur nous allons maintenant injecter le service:
Dans le controller, nous allons maintenant injecter le service :

```php
class UserController extends Controller
Expand Down
15 changes: 4 additions & 11 deletions docs/structure.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Ici, vous retrouverez les dossiers suivants :
- __Events__ : Dossier dans lequel sera sauvegardé les events générés par Bow Console.
- __Models__ : Dossier dans lequel sera sauvegardés les modèles de l'application.
- __Validations__ : Dossier dans lequel sera sauvegardées les validations de l'application.
- __Exceptions__ : Dossier dans lequel sera sauvegardées les exceptions personnalisés de l'application.
- __Exceptions__ : Dossier dans lequel sera sauvegardées les exceptions personnalisées de l'application.
- __Services__ : Dossier dans lequel sera sauvegardés les services générés par Bow Console.
- __Producers__ : Dossier dans lequel sera sauvegardés les producers générés par Bow Console.
- __Commandes__ : Dossier dans lequel sera sauvegardées les commandes générées par Bow Console.
Expand All @@ -54,7 +54,7 @@ Vous trouverez aussi les fichiers suivants :

## Dossier frontend

C'est là que vous allez insérer tous les fichiers qui sont utilisés dans les vues de votre application. Vous y retrouverez les dossiers suivant:
C'est là que vous allez insérer tous les fichiers qui sont utilisés dans les vues de votre application. Vous y retrouverez les dossiers suivants :

- __js__: Votre fichier `Javascript` seront sauvegardés ici.
- __sass__: Votre ficher scss seront sauvegardés ici.
Expand All @@ -68,19 +68,12 @@ C'est là que vous allez insérer tous les fichiers qui sont utilisés dans les

## Dossier var

Ici, Bow va stocker les fichiers de log et le cache de votre application. Vous y retrouverez les dossiers suivant:
Ici, Bow va stocker les fichiers de log et le cache de votre application. Vous y retrouverez les dossiers suivants :

- __storage__: Dossier dans lequel l'application sauvegarde les fichiers téléchargé de l'application
- __storage__: Dossier dans lequel l'application sauvegarde les fichiers téléchargés de l'application
- __logs__: Dossier dans lequel est sauvegardés les logs de l'application.
- __session__: Dossier dans lequel est sauvegardés les fichiers de session de l'application.
- __cache__: Dossier dans lequel l'application sauvegarde les caches de l'application
- __view__: Dossier dans lequel l'application sauvegarde le cache de compilation des vues

## Dossier tests

Ici, vous allez stocker vos fichiers de test unity. Et par souci de bien faire, nous avons :

- __Http__: Vos sauvegarder vos fichiers de test Http seront ici
- __Unity__: Vos fichiers de test Unity seront ici

<SuggestionFeature />
12 changes: 6 additions & 6 deletions docs/upload.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import SuggestionFeature from "@site/src/components/Partials/SuggestionFeature";
- [Traiter les fichiers envoyés](#traiter-les-fichiers-envoyés)
- [Determiner si un fichier existe](#determiner-si-un-fichier-existe)
- [Validation des téléchargements réussis](#validation-des-téléchargements-réussis)
- [Savegarder le fichier](#savegarder-le-fichier)
- [Sauvegarder le fichier](#savegarder-le-fichier)
- [Il manque quelque chose ?](#il-manque-quelque-chose-)

## Traiter les fichiers envoyés

Souvent les requêtes sont associés à des fichiers envoyés par l'utilisateur, vous pouvez traiter ces fichiers sur [`Bow\Http\Request`](https://bowphp.com/api/master/Bow/Http/Request.html) les méthodes `file` et le helper du même nom.

Considérons le formulaire suivant:
Considérons le formulaire suivant :

```html
<form action="/upload" method="post" enctype="multipart/form-data">
Expand All @@ -40,7 +40,7 @@ $app->post('/upload', function(Request $request) {
});
```

Le resultat de `debug` :
Le résultat de `debug` :

```php
// Debug output
Expand Down Expand Up @@ -87,9 +87,9 @@ $file = $request->file('photo');
$file->moveTo("/path/to/your/store/directory", $filename = null);
```

Si `$filename` est `null`, sa valeur sera le nom du fichier hasher avec la méthode [`getHashName`](https://bowphp.com/api/master/Bow/Http/UploadFile.html#method_getHashName).
Si `$filename` est `null`, sa valeur sera le nom du fichier hashé avec la méthode [`getHashName`](https://bowphp.com/api/master/Bow/Http/UploadFile.html#method_getHashName).

Souvent dans le cas où vous attendez des fichiers envoyé via un formulaire dont le champs est sous la forme `photo[]`. la méthode `file` retourne une [`Bow\Support\Collection`](https://bowphp.com/api/master/Bow/Support/Collection.html):
Souvent dans le cas où vous attendez des fichiers envoyé via un formulaire dont les champs est sous la forme `photo[]`. La méthode `file` retourne une [`Bow\Support\Collection`](https://bowphp.com/api/master/Bow/Support/Collection.html):

```html
<form action="/upload" method="post" enctype="multipart/form-data">
Expand All @@ -99,7 +99,7 @@ Souvent dans le cas où vous attendez des fichiers envoyé via un formulaire don
</form>
```

Dans cette exemple, la méthode `file` retournera une [`Bow\Support\Collection`](https://bowphp.com/api/master/Bow/Support/Collection.html) qui contiendra pour chaque oruccencre une instance de [`Bow\Http\UploadFile`](https://bowphp.com/api/master/Bow/Http/UploadFile.html).
Dans cet exemple, la méthode `file` retournera une [`Bow\Support\Collection`](https://bowphp.com/api/master/Bow/Support/Collection.html) qui contiendra pour chaque occurrence une instance de [`Bow\Http\UploadFile`](https://bowphp.com/api/master/Bow/Http/UploadFile.html).

```php
use Bow\Http\Request;
Expand Down
Loading

0 comments on commit 0b1a545

Please sign in to comment.