TCH099 : Un routeur PHP pour les pages et l’API
TCH099 est un projet pédagogique qui combine pages frontend statiques et API PHP. Les routes exposent la frontière: certains chemins retournent du HTML, tandis que d’autres appellent des scripts serveur.
Langages du dépôtHTML 30.29%8
Parts calculées à partir des octets GitHub Linguist.
| Langage | % | Octets |
|---|---|---|
| HTML | 21 098 | |
| PHP | 17 017 | |
| Java | 16 757 | |
| Jupyter Notebook | 6 341 | |
| Shell | 5 061 | |
| Python | 2 782 |
2 autres langages
| Dockerfile | 0.7% | 490 |
| CSS | 0.15% | 102 |
Aperçu
Pourquoi il existe
Environnement multi-conteneurs isolé avec réseau bridge, persistance MariaDB et interface web.
Cas d’usage
Référence d'architecture conteneurisée pour application et base de données.
Démarrage
Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.
cd db
python3 -m pip install mysql-connector-python python-dotenv
python3 db.pysudo usermod -aG docker $USER
newgrp docker # or log out and back incurl -fsSL https://raw.githubusercontent.com/yourusername/docker-install/main/install-docker.sh -o install-docker.sh
chmod +x install-docker.sh
sudo ./install-docker.shdocker-compose up -d --buildsudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-composedocker --version
docker run hello-world
docker-compose --versionRéférences du dépôt
Extraits des guides du dépôt, dans leur langue d’origine. Les liens ouvrent la version du code consultée.
Prérequis et premier essai
Docker Installation Guide
scripts/README.md
Prerequisites
scripts/README.md
Installing Docker Compose
scripts/README.md
Installing Docker Desktop
scripts/README.md
- Create and verify your Docker account first at Docker Hub
- Download Docker Desktop for your platform:
- Windows
- macOS
- Linux
- Install and launch the application
- Sign in with your Docker account when prompted
Automated Installation
scripts/README.md
Use our automated installation script for Ubuntu/Debian systems: The script will:
- Install Docker Engine and Docker Compose
- Optionally install Docker Desktop
- Add your user to the docker group
- Remind you about creating and verifying your Docker account Remember: Docker requires a Docker account for using Docker Desktop and Docker Hub features. Make sure to create an account at Docker Hub and verify your email before using Docker Desktop.
Configuration et utilisation
Configuration de l'environnement
README.md
Utilisation de Docker
README.md
Pour exécuter l’application localement via Docker: Une fois démarré, vous pourrez accéder aux points d’entrée suivants:
- Base de données: mysql:host=localhost;port=3306;dbname=mydatabase
- Administrateur: admin / rootpassword
- Utilisateur: user / password
Table Clients
db/README.md
| id | username | password | role | created_at | updated_at | |
|---|---|---|---|---|---|---|
| 1 | alice | [email protected] | pass123 | client | 2023-01-01 00:00:00 | 2023-01-01 00:00:00 |
| 2 | bob | [email protected] | pass456 | client | 2023-02-01 00:00:00 | 2023-02-01 00:00:00 |
| 3 | carol | [email protected] | pass789 | admin | 2023-03-01 00:00:00 | 2023-03-01 00:00:00 |
Utilisation de Variables d'Environnement
api/README.md
Exemple d'Utilisation
api/README.md
API et intégration
Comment ajouter un nouveau point d'API
README.md
Pour ajouter un nouveau point d’API:
- Créer le fichier PHP Créez votre fichier PHP dans le dossier api/:
- Ajouter la route Ajoutez une nouvelle route dans routes.php:
- Tester votre API Vous pouvez tester votre API avec curl ou un navigateur:
Exploitation et dépannage
4. **UPDATE**
db/README.md
Troubleshooting
scripts/README.md
- Permission denied error:
- Docker daemon not running:
- WSL 2 issues on Windows:
- Enable WSL 2 in Windows features
- Update WSL 2 kernel with: wsl –update
Workflow 1: Deploy PHP App to Azure Web App
.github/workflows/README.md
Workflow 2: Deploy Static Content to GitHub Pages
.github/workflows/README.md
Documentation source
6 documents lus parmi 6 candidats.
Fonctions et composants 2
- Routes des pages
- routes.php charge router.php, associe accueil et connexion aux fichiers frontend et définit les pages 403 et 404. Le callback /admin vérifie explicitement isAdmin avant de choisir la réponse.
- Scripts API
- Connexion, inscription, déconnexion et user_details ont leurs scripts API. Des routes de démonstration incluent une langue et une image aléatoire. Les scripts traitent les requêtes; le routeur choisit leur destination.
Architecture
Les composants et leurs liens restent lisibles en texte. Le diagramme ajoute une vue interactive.
- Navigateur ou client mobile
- Routeur PHP
- Page HTML
- Script API
- Données applicatives
Liens vérifiés dans le dépôt.
Mermaid Diagramme interactif (chargement à l’ouverture)
Vue générale des composants et des échanges vérifiés dans le dépôt.

flowchart LR
n0["Navigateur ou client mobile"]
n1["Routeur PHP"]
n2["Page HTML"]
n3["Script API"]
n4["Données applicatives"]
n0 --> n1
n1 --> n2
n1 --> n3
n3 --> n4
Version texte du diagramme
- Navigateur ou client mobile → Routeur PHP
- Routeur PHP → Page HTML
- Routeur PHP → Script API
- Script API → Données applicatives
Suivre un parcours dans le code
Comparez GET /login et POST /api/login. Le premier choisit une page; le second lance l’authentification. Les contrôles doivent protéger les opérations API autant que la page administrative.
API HTTP et permissions
routes.php associe les chemins ci-dessous. Le README montre des chemins comme /api/login.php et des messages en français. Les gestionnaires utilisent les chemins de ce tableau et des messages en anglais. La colonne d’accès indique un contrôle trouvé dans le gestionnaire.
| Méthode | Chemin | Contrôle vérifié | Fichier |
|---|---|---|---|
POST | /api/login | Aucun contrôle de session. loginUser vérifie l’empreinte du mot de passe. | api/login.php |
POST | /api/signup | Aucun contrôle de session. Le rôle du corps doit être admin ou client, y compris admin pour un nouveau compte. | api/signup.php |
POST | /api/logout | Aucun contrôle de session. Le gestionnaire détruit la session. | api/logout.php |
GET | /api/user_details | Exige la clé de session user_loggedin. Le rôle n’est pas vérifié. | api/user_details.php |
GET | /api/clients | Exige user_loggedin et le rôle de session admin. Sinon le JSON dit Access denied. | api/clients.php |
GET | /admin | Page, pas du JSON. isAdmin() inclut admin.html, sinon 403.html. | routes.php |
GET, POST | /api/hello-world/$langue | Aucun contrôle de session. Une session connectée remplace prenom par le nom d’utilisateur. | api/hello-world.php |
GET, POST | /api/random-image | Aucun contrôle de session dans le gestionnaire. | api/random-image.php |
Séquence limitée au chemin cité.
sequenceDiagram
participant Browser
participant Login as api/login.php
participant Users as Clients table
Browser->>Login: POST /api/login JSON
Login->>Users: SELECT by username
Users-->>Login: row
Login-->>Browser: status, message, redirectPOST /api/login
Content-Type: application/json
{
"username": "example",
"password": "local-dev-password"
}Réponse et erreurs
- Succès :
api/login.phpretournestatus: success,message: Login successfuletredirect: /home. - Identifiants invalides : le corps JSON contient
status: erroretInvalid username or password. - Autres méthodes HTTP : le corps JSON contient
Invalid request method. - Langue des messages : le gestionnaire utilise l’anglais, tandis que les exemples du README sont en français.
- Détails de session :
GET /api/user_detailsexigeuser_loggedinet retourneuser_detailsdepuis la session. - Liste des clients :
GET /api/clientsexige aussi le rôleadmin. Sa requêteSELECT * FROM Clientsinclut la colonne du mot de passe dans une réponse réussie. - Démonstrations publiques : les requêtes
GETetPOSTvers/api/hello-world/$langueet/api/random-imagen’ont pas de contrôle de session. Hello World utilise le nom de session pourprenomlorsqu’il existe. - Image aléatoire :
imageType: humanretourne l’URL thispersondoesnotexist.com. Toute autre valeur appelle The Cat API.
Authentification, limites et pagination
POST /api/signup accepte le rôle admin ou client dans le JSON. signup.php n’exige pas une session administrateur avant d’enregistrer ce rôle. router.php envoie Access-Control-Allow-Origin: *. Ces gestionnaires ne fixent pas de limite de débit. GET /admin est une page: routes.php appelle isAdmin() et inclut sinon 403.html. La connexion ne définit pas de statut HTTP d’erreur; l’échec reste dans le JSON.
Déploiement et exploitation
Les ports, le stockage et les relations de démarrage ci-dessous viennent de la configuration du dépôt. depends_on indique l’ordre de démarrage, pas la disponibilité du service.
Réseau. Bridge network tch099-network. The Compose file does not set host networking.
Carte du déploiement
Topologie Compose des services, ports et dépendances de démarrage documentés.

flowchart LR
classDef svc fill:#1b3040,stroke:#6fdbd0,color:#edf4fb
web["web<br/>8001:80"]:::svc
db["db<br/>3306:3306"]:::svc
phpmyadmin["phpmyadmin<br/>8060:80"]:::svc
db --> web
db --> phpmyadminVersion texte du diagramme
- web — Build from Dockerfile · 8001:80 → db, startup order only
- db — mariadb:latest · 3306:3306
- phpmyadmin — phpmyadmin/phpmyadmin · 8060:80 → db, startup order only
| Service | Image ou build | Ports publiés | Démarrage | Stockage |
|---|---|---|---|---|
| web | Build from Dockerfile | 8001:80 | db, startup order only | Bind mount of the repository at /var/www/html |
| db | mariadb:latest | 3306:3306 | Named volume dbdata | |
| phpmyadmin | phpmyadmin/phpmyadmin | 8060:80 | db, startup order only |
Noms de variables documentés. Les valeurs ne sont pas recopiées.
DB_HOSTDB_PORTMYSQL_ROOT_PASSWORDMYSQL_DATABASEMYSQL_USERMYSQL_PASSWORDPMA_HOST
Types et structure des fichiers
5 types déclarés, dont 5 dans l’aperçu des relations de base.
Diagramme des types
classDiagram
direction TB
class t4c474a248da2["HttpClient"] {
getInstance()
execute()
runOnUiThread()
showToast()
}
class t8be3c8236c60["LoginActivity"] {
onCreate()
loginUser()
sendNotification()
createNotificationChannel()
}
class t30126744bba2["MainActivity"] {
onCreate()
}
class t2369eda48b07["SignupActivity"] {
onCreate()
signupUser()
}
class ta93831bff0ab["UserDetailsActivity"] {
onCreate()
fetchUserDetails()
}
class b77dd461be19c["AppCompatActivity"] {
<<unresolved_base>>
}
t8be3c8236c60 ..> b77dd461be19c : declared base
class bad280d6f8481["AppCompatActivity"] {
<<unresolved_base>>
}
t30126744bba2 ..> bad280d6f8481 : declared base
class be4547a562aeb["AppCompatActivity"] {
<<unresolved_base>>
}
t2369eda48b07 ..> be4547a562aeb : declared base
class bf6fdb00a13f1["AppCompatActivity"] {
<<unresolved_base>>
}
ta93831bff0ab ..> bf6fdb00a13f1 : declared base
Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.
Index des types
HttpClient(class) ·MyMobileApp/MyApplication/app/src/main/java/com/tch099/HttpClient.java:20Méthodes dans l’aperçu :
getInstance, execute, runOnUiThread, showToast.LoginActivity(class) ·MyMobileApp/MyApplication/app/src/main/java/com/tch099/LoginActivity.java:31Méthodes dans l’aperçu :
onCreate, loginUser, sendNotification, createNotificationChannel.Bases déclarées :
AppCompatActivity.MainActivity(class) ·MyMobileApp/MyApplication/app/src/main/java/com/tch099/MainActivity.java:11Méthodes dans l’aperçu :
onCreate.Bases déclarées :
AppCompatActivity.SignupActivity(class) ·MyMobileApp/MyApplication/app/src/main/java/com/tch099/SignupActivity.java:15Méthodes dans l’aperçu :
onCreate, signupUser.Bases déclarées :
AppCompatActivity.UserDetailsActivity(class) ·MyMobileApp/MyApplication/app/src/main/java/com/tch099/UserDetailsActivity.java:19Méthodes dans l’aperçu :
onCreate, fetchUserDetails.Bases déclarées :
AppCompatActivity.
Référence
28 / 28 fichiers admissibles lus (109 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 0 diagnostic de syntaxe.
Ce que couvre l’analyse
Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.
Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.
Carte des fichiers
flowchart TD
root["TCH099"]
f0["README.md"]
root --> f0
f1["router.php"]
root --> f1
f2["routes.php"]
root --> f2
f3["config.php"]
root --> f3
f4["docker-compose.yml"]
root --> f4
f5["api/README.md"]
root --> f5
f6["api/clients.php"]
root --> f6
f7["api/hello-world.php"]
root --> f7
f8["api/login.php"]
root --> f8
f9["api/logout.php"]
root --> f9
f10["api/random-image.php"]
root --> f10
f11["api/signup.php"]
root --> f11
f12["api/user_details.php"]
root --> f12
f13["db/README.md"]
root --> f13
f14["db/db.py"]
root --> f14
f15["frontend/README.md"]
root --> f15
Fichiers à lire 3
Références
Fiche projet