Section courante

A propos

Section administrative du site

Les premiers pas

La page suivant explique les étapes minimales requises pour configurer une application Web avec Fano Framework fonctionnelle sur une machine de développement.

Prérequis

Créer une application

Assurez-vous que toutes les exigences ci-dessus sont remplies. Exécutez :

fanocli --project-http=Hello
cd Hello
fanocli --controller=Home --route=/
./build.sh
./bin/app.cgi

Exécutez-le depuis un navigateur

Ouvrez un navigateur Web et accédez à http://localhost:20477. Vous devriez voir le texte du contrôleur Home s'afficher dans le navigateur. Félicitations, votre application fonctionne.

Procédure pas à pas des commandes

Examinons chaque commande ci-dessus pour comprendre ce qu'elle fait. La commande suivante indique à Fano CLI de créer un projet d'application Web http dans le répertoire Hello. Le répertoire ne doit pas exister. Lisez Création d'un projet avec Fano CLI pour créer différents projets d'application Web (CGI, FastCGI, SCGI, uwsgi ou http).

fanocli --project-http=Hello

Nous changeons le répertoire actif pour le répertoire Hello nouvellement créé.

cd Hello

Créez un contrôleur nommé HomeController.pas gérant la requête vers la route «/» :

fanocli --controller=Home --route=/

Sans --route=/, par défaut, Fano CLI créera la même route que le nom du contrôleur en minuscules, c'est-à-dire /home. Si vous omettez --route=/, vous ne pourrez accéder à HomeController qu'en utilisant l'URL http://localhost:20477/home au lieu de http://localhost:20477.

Compiler l'application :

./build.sh

Exécuter l'application :

./bin/app.cgi

Par défaut, l'exécutable généré portera le nom app.cgi dans le répertoire bin.

Présentation du répertoire du projet

Fano Framework n'a pas d'avis sur la structure des répertoires de votre projet. Vous pouvez structurer les répertoires et les fichiers de votre projet comme vous le souhaitez. Cependant, Fano CLI crée plusieurs fichiers et répertoires qui suivent certaines hypothèses.

Répertoires

Répertoire Description
src Répertoire du code source du projet d'application
bin Répertoire de sortie des binaires compilés
config Répertoire de configuration de l'application
resources Répertoire de ressources d'application, telles que les modèles HTML, SCSS,...
storages Répertoire des fichiers générés par l'exécution de l'application, tels que les fichiers de session, les journaux,...
tools Répertoire des scripts d'aide de l'interpréteur de commande, tels que les scripts pour nettoyer les binaires compilés.
public Répertoire racine du document d'application où résident les ressources publiques telles que les images, les feuilles de style en cascade et les fichiers JavaScript.

Fichiers

src/app.pas

Il s'agit du code source typique du programme principal de l'application Web étant généré par Fano CLI (les commentaires sont omis par souci de concision) :

  1. program app;
  2.  
  3. uses
  4.  
  5.     {$IFDEF UNIX}
  6.     cthreads,
  7.     {$ENDIF}
  8.     sysutils,
  9.     fano,
  10.     bootstrap;
  11.  
  12. var
  13.     appInstance : IWebApplication;
  14.     cliParams : ICliParams;
  15.     svrConfig : TFpwebSvrConfig;
  16.  
  17. begin
  18.     cliParams := (TGetOptsParams.create() as ICliParamsFactory)
  19.         .addOption('host', 1)
  20.         .addOption('port', 1)
  21.         .build();
  22.     svrConfig.host := cliParams.getOption('host', '127.0.0.1');
  23.     svrConfig.port := cliParams.getOption('port', 20477);
  24.     writeln('Starting application at ', svrConfig.host, ':', svrConfig.port);
  25.  
  26.     svrConfig.documentRoot := getCurrentDir() + '/public';
  27.     svrConfig.serverName := 'http.fano';
  28.     svrConfig.serverAdmin := 'admin@http.fano';
  29.     svrConfig.serverSoftware := 'Fano Framework Web App';
  30.     svrConfig.timeout := 120;
  31.  
  32.     //décommenter les lignes suivantes prend en charge https
  33.     //svrConfig.useTLS := true;
  34.     //svrConfig.tlsKey := '/path/to/ssl/cert/key';
  35.     //svrConfig.tlsCert := '/path/to/ssl/cert/cert';
  36.  
  37.     appInstance := TDaemonWebApplication.create(
  38.         TFpwebAppServiceProvider.create(
  39.             TAppServiceProvider.create(),
  40.             svrConfig
  41.         ),
  42.         TAppRoutes.create()
  43.     );
  44.     appInstance.run();
  45. end.

Le programme principal crée une instance d'application Web et des instances de fournisseur de services pour créer tous les services dont votre application a besoin, puis l'exécuter.

TDaemonWebApplication et TFpWebAppServiceProvider sont des classes intégrées fournies par Fano Framework pour prendre en charge la création d'applications Web http de longue durée utilisant la bibliothèque de serveur http Fpweb de Free Pascal.

Selon le paramètre que vous utilisez pour créer un projet avec Fano CLI, il peut finir par utiliser TIndyAppServiceProvider, TMhdAppServiceProvider, TFastCgiAppServiceProvider, TScgiAppServiceProvider, TUwsgiAppServiceProvider pour une application Web http basée sur le serveur http Indy, le serveur http libmicrohttpd, FastCGI, SCGI, l'application Web uwsgi respectivement.

TAppServiceProvider et TAppRoutes sont deux classes spécifiques à votre application étant responsables de la création de tous les services et itinéraires requis par votre application. Les deux sont déclarées dans l'unité bootstrap.pas

src/bootstrap.pas

Ce fichier typique est généré par Fano CLI (les commentaires sont omis par souci de concision) pour permettre à l'application d'initialiser tous les services et itinéraires dont elle a besoin.

  1. unit bootstrap;
  2.  
  3. interface
  4.  
  5. uses
  6.  
  7.     fano;
  8.  
  9. type
  10.  
  11.     TAppServiceProvider = class(TDaemonAppServiceProvider)
  12.     protected
  13.  
  14.     public
  15.         procedure register(const container : IDependencyContainer); override;
  16.     end;
  17.  
  18.     TAppRoutes = class(TRouteBuilder)
  19.     public
  20.         procedure buildRoutes(
  21.             const container : IDependencyContainer;
  22.             const router : IRouter
  23.         ); override;
  24.     end;
  25.  
  26. implementation
  27.  
  28. uses
  29.     sysutils,
  30.     HomeControllerFactory;
  31.  
  32.  
  33.  
  34.     procedure TAppServiceProvider.register(const container : IDependencyContainer);
  35.     begin
  36.         {$INCLUDE Dependencies/dependencies.inc}
  37.     end;
  38.  
  39.     procedure TAppRoutes.buildRoutes(
  40.         const container : IDependencyContainer;
  41.         const router : IRouter
  42.     );
  43.     begin
  44.         {$INCLUDE Routes/routes.inc}
  45.     end;
  46. end.

TAppServiceProvider est une classe qui implémente l'interface IServiceProvider ayant un nom de méthode register(). Elle sera appelée par Fano Framework lors de l'initialisation et recevra une instance du conteneur de dépendances. Dans cette méthode, vous initialisez tous les services requis par votre application. TAppServiceProvider hérite de TDaemonAppServiceProvider configurant les services communs pour les applications Web de longue durée.

TAppRoutes est une classe implémentant l'interface IRouteBuilder ayant une méthode buildRoutes() à implémenter. Elle hérite de TRouteBuilder, une classe abstraite implémentant cette interface. L'application crée des routes dans la méthode buildRoutes().

Pour simplifier la création de ce fichier, Fano CLI utilise deux fichiers d'inclusion principaux dependencies.inc et routes.inc.

src/Dependencies/dependencies.inc

Les extraits suivants montrent le contenu typique de ce fichier (les commentaires sont omis pour des raisons de concision). Chaque ligne contient des fichiers spécifiques à un usage particulier :

  1. {$INCLUDE main.dependencies.inc}
  2. {$INCLUDE middlewares.dependencies.inc}
  3. {$INCLUDE models.dependencies.inc}
  4. {$INCLUDE views.dependencies.inc}
  5. {$INCLUDE controllers.dependencies.inc}

Par exemple, dans controllers.dependencies.inc, vous pouvez avoir le code suivant :

  1. container.add('homeController', THomeControllerFactory.create());

enregistrant la classe d'usine pour le contrôleur domestique à l'aide de la clef homeController.

src/Routes/routes.inc

Il s'agit d'un fichier d'itinéraires typique généré par Fano CLI comme indiqué ci-dessous :

  1. {$INCLUDE Home/routes.inc}

Qui à leur tour incluent d'autres fichiers. Par exemple, src/Routes/Home/routes.inc peut contenir le code suivant :

  1. router.get('/', container.get('homeController') as IRequestHandler);

Le code ci-dessus enregistre la route / avec la méthode GET sur l'instance du contrôleur domestique.

src/App/Home/Controllers/HomeController.pas

Ce code de contrôleur typique est généré par Fano CLI (les commentaires sont omis pour des raisons de concision). Il hérite de TAbstractController étant une classe abstraite implémentant l'interface IRequestHandler possédant une méthode handleRequest().

  1. unit HomeController;
  2.  
  3. interface
  4.  
  5. {$MODE OBJFPC}
  6. {$H+}
  7.  
  8. uses
  9.  
  10.     fano;
  11.  
  12. type
  13.  
  14.     THomeController = class(TAbstractController)
  15.     public
  16.         function handleRequest(
  17.             const request : IRequest;
  18.             const response : IResponse;
  19.             const args : IRouteArgsReader
  20.         ) : IResponse; override;
  21.     end;
  22.  
  23. implementation
  24.  
  25.     function THomeController.handleRequest(
  26.         const request : IRequest;
  27.         const response : IResponse;
  28.         const args : IRouteArgsReader
  29.     ) : IResponse;
  30.     begin
  31.         response.body().write('Home controller');
  32.         result := response;
  33.     end;
  34.  
  35. end.

Lorsque la requête du navigateur Internet route «/», la méthode handleRequest() est appelée, affichant le contrôleur Home dans le navigateur.

La méthode handleRequest() reçoit la requête, la réponse et l'instance de paramètre de route que vous pouvez utiliser, par exemple, pour lire le paramètre de chaîne de caractères de requête.



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