SmarMaker - Documentation
Docs» 15_training:module8-backend-api:routage

Chapitre 1 : Routage

Le fichier api.php définit toutes les routes de l'API.

Structure de base

snippet.php
<?php
// pwa/api.php
 
require_once '../smartmaker-api-prepend.php';
 
use SmartAuth\Api\AuthController;
use SmartAuth\Api\RouteController as Route;
use MonModule\Api\ItemController;
 
// Routes d'authentification (SmartAuth)
Route::get('login',     AuthController::class, 'index');
Route::post('login',    AuthController::class, 'login');
Route::get('refresh',   AuthController::class, 'refresh');
Route::post('logout',   AuthController::class, 'logout', true);
 
// Vos routes métier
Route::get('items',         ItemController::class, 'index', true);
Route::get('items/{id}',    ItemController::class, 'show', true);
Route::post('items',        ItemController::class, 'create', true);
Route::put('items/{id}',    ItemController::class, 'update', true);
Route::delete('items/{id}', ItemController::class, 'delete', true);
 
// Fallback (aucune route ne correspond)
json_reply('Access denied', 403);

Syntaxe des routes

snippet.php
Route::action(path, Controller::class, method, protected);
Paramètre Description
action Méthode HTTP : get, post, put, delete
path Chemin de l'API (ex: items, items/{id})
Controller::class Classe PHP à appeler
method Méthode de la classe
protected true = authentification requise

Routes publiques vs protégées

snippet.php
// Route publique (accessible sans token)
Route::get('public/info', InfoController::class, 'index', false);
Route::get('public/info', InfoController::class, 'index');  // false par défaut
 
// Route protégée (token JWT requis)
Route::get('items', ItemController::class, 'index', true);

Paramètres dynamiques

Les paramètres entre accolades sont passés au controller :

snippet.php
// Route
Route::get('items/{id}', ItemController::class, 'show', true);
Route::get('items/{id}/files/{fileId}', ItemController::class, 'getFile', true);
 
// Appel : GET /items/123
// Dans le controller :
public function show($payload)
{
    $id = $payload['id'];  // 123
}
 
// Appel : GET /items/123/files/456
// Dans le controller :
public function getFile($payload)
{
    $id = $payload['id'];          // 123
    $fileId = $payload['fileId'];  // 456
}

Données POST/PUT

Les données JSON sont automatiquement parsées :

snippet.php
// Route
Route::post('items', ItemController::class, 'create', true);
 
// Appel : POST /items avec body { "label": "Test", "price": 29.99 }
// Dans le controller :
public function create($payload)
{
    $label = $payload['label'];  // "Test"
    $price = $payload['price'];  // 29.99
}

Exemple complet

snippet.php
<?php
// pwa/api.php
 
require_once '../smartmaker-api-prepend.php';
 
use SmartAuth\Api\AuthController;
use SmartAuth\Api\RouteController as Route;
use MonModule\Api\ProductController;
use MonModule\Api\CategoryController;
use MonModule\Api\FileController;
 
// ========================================
// AUTHENTIFICATION (SmartAuth)
// ========================================
Route::get('login',     AuthController::class, 'index');
Route::post('login',    AuthController::class, 'login');
Route::get('refresh',   AuthController::class, 'refresh');
Route::post('logout',   AuthController::class, 'logout', true);
Route::post('device',   AuthController::class, 'device', true);
 
// ========================================
// PRODUITS
// ========================================
Route::get('products',              ProductController::class, 'index', true);
Route::get('products/{id}',         ProductController::class, 'show', true);
Route::post('products',             ProductController::class, 'create', true);
Route::put('products/{id}',         ProductController::class, 'update', true);
Route::delete('products/{id}',      ProductController::class, 'delete', true);
 
// Recherche avec filtres
Route::post('products/search',      ProductController::class, 'search', true);
 
// ========================================
// CATÉGORIES
// ========================================
Route::get('categories',            CategoryController::class, 'index', true);
Route::get('categories/{id}',       CategoryController::class, 'show', true);
 
// ========================================
// FICHIERS
// ========================================
Route::get('files/{element}/{parentId}/{ref}',
    FileController::class, 'download', true);
 
Route::post('files/{element}/{parentId}',
    FileController::class, 'upload', true);
 
// ========================================
// ROUTES PUBLIQUES
// ========================================
Route::get('public/info',           InfoController::class, 'index');
 
// ========================================
// FALLBACK
// ========================================
json_reply('Access denied', 403);

Le fichier smartmaker-api-prepend.php

Ce fichier (généré par SmartBoot) initialise l'environnement :

snippet.php
<?php
// smartmaker-api-prepend.php
 
// Headers Dolibarr obligatoires
$res = 0;
if (!$res && file_exists("../main.inc.php")) {
    $res = @include "../main.inc.php";
}
if (!$res && file_exists("../../main.inc.php")) {
    $res = @include "../../main.inc.php";
}
 
// Charger SmartAuth
require_once DOL_DOCUMENT_ROOT . '/smartauth/class/api.class.php';
 
// Autoloader pour les classes du module
spl_autoload_register(function ($class) {
    $prefix = 'MonModule\\Api\\';
    $base_dir = __DIR__ . '/smartmaker-api/';
 
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        return;
    }
 
    $relative_class = substr($class, $len);
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
 
    if (file_exists($file)) {
        require $file;
    }
});

Réponses JSON

Les controllers retournent un tableau [données, code HTTP] :

snippet.php
// Succès
return [['items' => $items], 200];
return [['id' => $newId], 201];  // Created
return ['Updated', 200];
 
// Erreurs
return ['Not Found', 404];
return ['Bad Request', 400];
return ['Forbidden', 403];
return ['Server Error', 500];

Points clés à retenir

  1. Route::action() pour définir chaque endpoint
  2. true en dernier paramètre pour les routes authentifiées
  3. Paramètres dynamiques avec {nom}
  4. Fallback obligatoire en fin de fichier
  5. Le controller reçoit tout dans $payload

← Retour au module | Chapitre suivant : Controllers →

Previous Next

Made with ❤ by CAP-REL · SmartMaker · GNU AGPL v3+
Code source · Faire un don
SmarMaker - Documentation
Traductions de cette page:
  • Français
  • Deutsch
  • English
  • Español
  • Italiano
  • Nederlands

Table of Contents

Table des matières

  • Chapitre 1 : Routage
    • Structure de base
    • Syntaxe des routes
    • Routes publiques vs protégées
    • Paramètres dynamiques
    • Données POST/PUT
    • Exemple complet
    • Le fichier smartmaker-api-prepend.php
    • Réponses JSON
    • Points clés à retenir
  • SmartAuth
  • SmartMaker - Back (PHP)
    • Mapping Dolibarr - React
  • SmartMaker - Front (React)
    • Animations de pages
    • Architecture
    • Astuces
    • Calendar
    • Composants et pages
    • Configuration du Provider
    • Debug et Logs
    • Hooks SmartCommon
    • PWA (Progressive Web App)
    • Requêtes API
    • Routage
    • SmartCommon
    • Stockage de données
    • Thèmes
    • Traductions
  • HowTo - Pas à pas - Votre première application
    • Développement PHP (back)
    • Développement React (front)
    • Première étape : Module Builder Dolibarr
    • SmartAuth
    • SmartBoot : Un "squelette" quasiment prêt à l'emploi
  • Formation SmartMaker
    • Module 1 : Fondamentaux JavaScript ES6+
      • Chapitre 1 : Variables et Scope
      • Chapitre 2 : Fonctions
      • Chapitre 3 : Programmation Asynchrone
      • Chapitre 4 : Modules ES6
    • Module 2 : Introduction à React
      • Chapitre 1 : Philosophie React
      • Chapitre 2 : JSX
      • Chapitre 3 : Composants
    • Module 3 : Hooks React Fondamentaux
      • Chapitre 1 : useState
      • Chapitre 2 : useEffect
      • Chapitre 3 : useRef
      • Chapitre 4 : useContext
    • Module 4 : React Avancé
      • Chapitre 1 : useCallback et useMemo
      • Chapitre 2 : Custom Hooks
      • Chapitre 3 : Redux et Redux Toolkit
    • Module 5 : Architecture SmartMaker
      • Chapitre 1 : Structure du projet
      • Chapitre 2 : Configuration
      • Chapitre 3 : Flux de données
    • Module 6 : SmartCommon - Composants
      • Chapitre 1 : Mise en page
      • Chapitre 2 : Navigation
      • Chapitre 3 : Formulaires
      • Chapitre 4 : Affichage
    • Module 7 : SmartCommon - Hooks
      • Chapitre 1 : useApi
      • Chapitre 2 : Gestion d'état
      • Chapitre 3 : Hooks utilitaires
    • Module 8 : Backend API (PHP)
      • Chapitre 1 : Routage
      • Chapitre 2 : Controllers
      • Chapitre 3 : Mappers
      • Extrafields et formulaires dynamiques
    • Module 9 : Intégration complète
      • Chapitre 1 : Backend
      • Chapitre 2 : Frontend
      • Chapitre 3 : Déploiement
    • Module 10 : Fonctionnalités avancées
      • Chapitre 1 : Mode offline
      • Chapitre 2 : Internationalisation (i18n)
      • Chapitre 3 : Autres fonctionnalités
    • Module 11 : Bonnes pratiques
  • Démonstration
  • Start
  • Composants et pages
  • Afficher le texte source
  • Anciennes révisions
  • Liens de retour
  • Haut de page