Section courante

A propos

Section administrative du site

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;


Dernière mise à jour : Vendredi, le 18 octobre 2024