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 :
- IDispatcher=Interface
- ['{F13A78C0-3A00-4E19-8C84-B6A7A77A3B25}']
-
- (*!-------------------------------------------
- * dispatch request
- *--------------------------------------------
- * @param environnement CGI env
- * @param Lecteur stdIn STDIN
- * @return réponse
- *--------------------------------------------*)
- Function dispatchRequest(
- const env:ICGIEnvironment;
- const stdIn:IStdIn
- ):IResponse;
- End;
- env, variable d'environnement CGI fournie par le serveur Web.
- stdIn, objet capable de lire STDIN.
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 :
- Var router:IRouteMatcher;
- ...
- container.add(
- 'dispatcher',
- TSimpleDispatcherFactory.create(
- router,
- TRequestResponseFactory.create()
- )
- );
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.
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 :
- Var router:IRouteMatcher;
- ...
- container.add(
- 'dispatcher',
- TSessionDispatcherFactory.create(
- container.get('appMiddlewares') as IMiddlewareLinkList,
- router,
- TRequestResponseFactory.create(),
- container.get('sessionManager') as ISessionManager,
- (TCookieFactory.create()).domain(config.getString('cookie.domain')),
- config.getInt('cookie.maxAge')
- )
- );
Pour autoriser le tunneling de verbes HTTP, encapsulez la fabrique de répartiteurs réelle avec TVerbTunnellingDispatcherFactory comme indiqué dans le code suivant :
- container.add(
- 'dispatcher',
- TVerbTunnellingDispatcherFactory.create(
- TSimpleDispatcherFactory.create(
- router,
- TRequestResponseFactory.create()
- )
- )
- );
Mode de maintenance
Pour permettre à l'application d'entrer en mode de maintenance, utilisez TMaintenanceModeDispatcher.
Pour enregistrer le répartiteur en mode de maintenance dans le conteneur de dépendances, utilisez la classe TMaintenanceModeDispatcherFactory.
- container.add(
- 'dispatcher',
- TMaintenanceModeDispatcherFactory.create(
- TVerbTunnellingDispatcherFactory.create(
- TSimpleDispatcherFactory.create(
- router,
- TRequestResponseFactory.create()
- )
- )
- )
- );
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().
- container.add(
- 'dispatcher',
- TMaintenanceModeDispatcherFactory.create(
- TVerbTunnellingDispatcherFactory.create(
- TSimpleDispatcherFactory.create(
- router,
- TRequestResponseFactory.create()
- )
- )
- ).path('/home/example/maintenance')
- );
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.
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 :
- TAppServiceProvider=Class(TDaemonAppServiceProvider)
- Protected
- Function buildDispatcher(
- Const ctnr:IDependencyContainer;
- Const routeMatcher:IRouteMatcher;
- Const config:IAppConfiguration
- ) : IDispatcher; override;
- ...
- End;
- ...
- Function TAppServiceProvider.buildDispatcher(
- const ctnr : IDependencyContainer;
- const routeMatcher : IRouteMatcher;
- const config : IAppConfiguration
- ):IDispatcher;
- Begin
- ctnr.add('appMiddlewares', TMiddlewareListFactory.create());
- ctnr.add(
- 'my-dispatcher',
- TDispatcherFactory.create(
- ctnr['appMiddlewares'] as IMiddlewareLinkList,
- routeMatcher,
- TRequestResponseFactory.create()
- )
- );
- Result:=ctnr['my-dispatcher'] as IDispatcher;
- End;