Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Référence des unités
Les premiers pas
Travailler avec l'application
Conteneur de dépendances
Répartiteur
Environnement CGI
Configurer l'application
Gestionnaire d'erreurs
Travailler avec un routeur
Travailler avec une base de données
Utilisation des journaux de bord
Travailler avec Fano CLI
Préface
Notes légales
Dictionnaire
Recherche

Répartiteur

Tâche de répartiteur

En général, la tâche d'un répartiteur est assez simple. Étant donné l'URI de la requête et la méthode HTTP, il demande au routeur de trouver une instance de la classe traitant la requête, de créer des intergiciels, de transmettre toutes les informations pertinentes et de l'exécuter.

Un répartiteur dans Fano Framework doit implémenter l'interface IDispatcher :

  1. IDispatcher=Interface
  2.     ['{F13A78C0-3A00-4E19-8C84-B6A7A77A3B25}']
  3.  
  4.     (*!-------------------------------------------
  5. * dispatch request
  6. *--------------------------------------------
  7. * @param environnement CGI env
  8. * @param Lecteur stdIn STDIN
  9. * @return réponse
  10. *--------------------------------------------*)
  11.     Function dispatchRequest(
  12.         const env:ICGIEnvironment;
  13.         const stdIn:IStdIn
  14.     ):IResponse;
  15. End;

Le Fano Framework transmettra l'instance de l'environnement CGI et l'instance IStdIn en fonction du protocole utilisé par votre application. Par exemple, l'utilisation du protocole CGI ou FastCGI entraînera une implémentation IStdin différente. Cependant, cela doit être transparent pour le développeur.

Implémentation de répartiteur intégrée

Le Fano Framework est fourni avec plusieurs implémentations de répartiteur :

Implémentation Description
TSimpleDispatcher Est un répartiteur léger n'offrant pas de couche middleware.
TXSimpleDispatcher Similaire à TSimpleDispatcher avec la possibilité de personnaliser les environnements de requête, de réponse et CGI. Ceci est fourni, par exemple, pour permettre le remplacement du paramètre _method par HTTP.
TDispatcher Est un répartiteur prenant en charge le middleware.
TXDispatcher Similaire à TDispatcher avec des capacités comme TXSimpleDispatcher.
TMwExecDispatcher Similaire à TXDispatcher sauf qu'il garantit que les middlewares globaux sont toujours exécutés bien que la route n'existe pas ou que le verbe de méthode ne soit pas autorisé.
TMaintenanceModeDispatcher Un répartiteur de décoration faisant entrer l'application en mode maintenance lorsqu'un fichier spécial existe.
TVerbTunnellingDispatcher Répartiteur de décorateur permettant à l'application Web de répondre aux requêtes via le tunneling de verbes HTTP.

Création d'un répartiteur

Si vous utilisez Fano CLI pour structurer votre projet d'application Web, vous pouvez ignorer cette étape car Fano CLI crée une instance de répartiteur pour vous.

Création d'un répartiteur simple :

  1. Var router:IRouteMatcher;
  2. ...
  3. container.add(
  4.     'dispatcher',
  5.     TSimpleDispatcherFactory.create(
  6.         router,
  7.         TRequestResponseFactory.create()
  8.     )
  9. );

Pour créer un répartiteur de base avec support middleware, vous devez passer une instance de l'instance IMiddlewareLinkList. container est une instance de IDependencyContainer.

  1. var router : IRouteMatcher;
  2. ...
  3. container.add(
  4.     'dispatcher',
  5.     TDispatcherFactory.create(
  6.         container.get('appMiddlewares') as IMiddlewareLinkList,
  7.         router,
  8.         TRequestResponseFactory.create()
  9.     )
  10. );

Pour créer un répartiteur avec prise en charge de session, vous devez utiliser TSessionDispatcherFactory comme indiqué dans le code suivant. Étant donné que la prise en charge de session dans Fano Framework est implémentée à l'aide d'une infrastructure middleware, vous devez également transmettre une instance de l'instance IMiddlewareLinkList :

  1. Var router:IRouteMatcher;
  2. ...
  3. container.add(
  4.     'dispatcher',
  5.     TSessionDispatcherFactory.create(
  6.         container.get('appMiddlewares') as IMiddlewareLinkList,
  7.         router,
  8.         TRequestResponseFactory.create(),
  9.         container.get('sessionManager') as ISessionManager,
  10.         (TCookieFactory.create()).domain(config.getString('cookie.domain')),
  11.         config.getInt('cookie.maxAge')
  12.     )
  13. );

Pour autoriser le tunneling de verbes HTTP, encapsulez la fabrique de répartiteurs réelle avec TVerbTunnellingDispatcherFactory comme indiqué dans le code suivant :

  1. container.add(
  2.     'dispatcher',
  3.     TVerbTunnellingDispatcherFactory.create(
  4.         TSimpleDispatcherFactory.create(
  5.             router,
  6.             TRequestResponseFactory.create()
  7.         )
  8.     )
  9. );

Mode de maintenance

Pour permettre à l'application d'entrer en mode de maintenance, utilisez TMaintenanceModeDispatcher.

  1. Var actualDispatcher:IDispatcher;
  2.     maintenanceModeDispatcher:IDispatcher;
  3. ...
  4.  
  5. maintenanceModeDispatcher:=TMaintenanceModeDispatcher.create(actualDispatcher);

Pour enregistrer le répartiteur en mode de maintenance dans le conteneur de dépendances, utilisez la classe TMaintenanceModeDispatcherFactory.

  1. container.add(
  2.     'dispatcher',
  3.     TMaintenanceModeDispatcherFactory.create(
  4.         TVerbTunnellingDispatcherFactory.create(
  5.             TSimpleDispatcherFactory.create(
  6.                 router,
  7.                 TRequestResponseFactory.create()
  8.             )
  9.         )
  10.     )
  11. );

Par défaut, ce répartiteur vérifie si le fichier __maintenance__ existe dans le répertoire courant. Si c'est le cas, il suppose que l'application est en mode maintenance et génère une exception EServiceUnavailable.

Pour que l'application passe en mode maintenance, créez un fichier vide avec le nom __maintenance__ dans le répertoire de travail actuel. Par exemple :

touch __maintenance__

Pour quitter le mode maintenance, il suffit de le supprimer :

rm __maintenance__

Pour utiliser un nom de fichier différent, définissez son chemin d'accès à l'aide de la méthode path() de TMaintenanceModeDispatcherFactory().

  1. container.add(
  2.     'dispatcher',
  3.     TMaintenanceModeDispatcherFactory.create(
  4.         TVerbTunnellingDispatcherFactory.create(
  5.             TSimpleDispatcherFactory.create(
  6.                 router,
  7.                 TRequestResponseFactory.create()
  8.             )
  9.         )
  10.     ).path('/home/example/maintenance')
  11. );

Définir le répartiteur

Le Fano Framework permet à l'application de modifier l'implémentation du répartiteur à utiliser, en remplaçant la méthode protégée buildDispatcher() de la classe TBasicServiceProvider. Dans cette implémentation de méthode, vous devez renvoyer une instance du répartiteur.

  1. Function TMyAppServiceProvider.buildDispatcher(Const container:IDependencyContainer):IDispatcher;Begin
  2.  Result:=container['dispatcher'] as IDispatcher;
  3. End;

Si vous utilisez Fano CLI pour structurer votre projet d'application Web, vous pouvez déclarer buildDispatcher() dans le fichier bootstrap.pas comme indiqué dans l'exemple suivant :

  1. TAppServiceProvider=Class(TDaemonAppServiceProvider)
  2.  Protected
  3.   Function buildDispatcher(
  4.         Const ctnr:IDependencyContainer;
  5.         Const routeMatcher:IRouteMatcher;
  6.         Const config:IAppConfiguration
  7.     ) : IDispatcher; override;
  8.     ...
  9. End;
  10. ...
  11. Function TAppServiceProvider.buildDispatcher(
  12.     const ctnr : IDependencyContainer;
  13.     const routeMatcher : IRouteMatcher;
  14.     const config : IAppConfiguration
  15. ):IDispatcher;
  16. Begin
  17.  ctnr.add('appMiddlewares', TMiddlewareListFactory.create());
  18.  ctnr.add(
  19.         'my-dispatcher',
  20.         TDispatcherFactory.create(
  21.             ctnr['appMiddlewares'] as IMiddlewareLinkList,
  22.             routeMatcher,
  23.             TRequestResponseFactory.create()
  24.         )
  25.     );
  26.  Result:=ctnr['my-dispatcher'] as IDispatcher;
  27. End;


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Vendredi, le 18 octobre 2024