Code Monkey home page Code Monkey logo

delphimvcframework's Introduction

#DMVCFramework features

  • Simple to use (really)
  • RESTful (RMM Level 3) compliant
  • Stable and solid, used by small/mid/big projects since 2010
  • Can be used in load balanced environment using Redis (http://Redis.io) [dev]
  • Optional session support
  • Extendable using middlewares (simple hooks to handle request/response)
  • CORS
  • Basic Authentication
  • Controllers inheritance
  • Fancy URL with parameter mappings
  • Specialied renders to generate text, html, JSON
  • Powerful mapper to map json to objects and datasets to objects
  • Can be packaged as stand alone server, apache module (XE6 or better) and ISAPI dll
  • Integrated RESTClient
  • Works with XE3, XE4, XE5, XE6, XE7, XE8 and Delphi 10 Seattle
  • Completely unit tested
  • There is a sample for each functionality
  • There is a complete set of trainings about it, but the samples are included in the project
  • Experimental support for IOCP [dev]
  • Server side generated pages using Mustache (https://mustache.github.io/) for Delphi (https://github.com/synopse/dmustache)
  • Specific trainings are available (ask me for a date and a place)
  • Messaging extension using STOMP (beta)
  • Automatic documentation through /system/describeserver.info
  • Driven by its huge community (Facebook group https://www.facebook.com/groups/delphimvcframework)
  • Simple and documented

Trainings, consultancy or custom development service

As you know, good support on open source software is a must for professional users. If you need trainings, consultancy or custom developments on DelphiMVCFramework, send an email to dmvcframework at bittime dot it. Alternatively you can send a request using the contacts forms on bittimeprofessionals website. bit Time Professionals is the company behind DelphiMVCFramework, al the main developers works there.

Sub Projects

DelphiMVCFramework contains also a lot of indipendent code that can be used in other kind of project.

These are the most notable:

##Samples and documentation DMVCFramework is provided with a lot of examples focused on specific functionality. All samples are in Samples folder

#Sample Server Below a basic sample of a DMVCFramework server wich can be deployed as standa-alone application, as an Apache module or as ISAPI dll. This flexibility is provided by the Delphi WebBroker framework (built-in in Delphi since Delphi 4).

To create this server, you have to create a new Delphi Projects -> WebBroker -> WebServerApplication. Then add the following changes to the webmodule.

unit WebModuleUnit1;

interface

uses System.SysUtils, System.Classes, Web.HTTPApp, MVCFramework {this unit contains TMVCEngine class};

type
  TWebModule1 = class(TWebModule)
    procedure WebModuleCreate(Sender: TObject);
    procedure WebModuleDestroy(Sender: TObject);

  private
    MVC: TMVCEngine;

  public
    { Public declarations }
  end;

var
  WebModuleClass: TComponentClass = TWebModule1;

implementation

{$R *.dfm}

uses UsersControllerU; //this is the unit where is defined the controller

procedure TWebModule1.WebModuleCreate(Sender: TObject);
begin
  MVC := TMVCEngine.Create(Self);
  MVC.Config['document_root'] := 'public_html'; //if you need some static html, javascript, etc (optional)
  MVC.AddController(TUsersController); //see next section to know how to create a controller
end;

procedure TWebModule1.WebModuleDestroy(Sender: TObject);
begin
  MVC.Free;
end;

end.

Remember that the files inside the redist folder must be in the executable path or in the system path. If starting the server whithin the IDE doesn't works, try to run the executable outside the IDE and check the dependencies. That's it! You have just created your first DelphiMVCFramework. Now you have to add a controller to respond to the http request.

#Sample Controller Below a basic sample of a DMVCFramework controller with 2 action

unit UsersControllerU;
  
interface
  
uses 
  MVCFramework;
 
type 
   [MVCPath('/users')]
   TUsersController = class(TMVCController)
   public
    
    //The following action will be with a GET request like the following
    //http://myserver.com/users/3
    [MVCPath('/($id)')]
    [MVCProduces('application/json')]
    [MVCHTTPMethod([httpGET])]
    [MVCDoc('Returns the users list as a JSON Array of JSON Objects')]
    procedure GetUsers(CTX: TWebContext);

    //The following action will be with a PUT request like the following
    //http://myserver.com/users/3
    //and in the request body there should be a serialized TUser
    [MVCPath('/($id)')]
    [MVCProduce('application/json')]
    [MVCHTTPMethod([httpPUT])]
    [MVCDoc('Update a user')]    
    procedure UpdateUser(CTX: TWebContext);

    //The following action will respond to a POST request like the following
    //http://myserver.com/users
    //and in the request body there should be the new user to create as json
    [MVCPath]
    [MVCProduce('application/json')]
    [MVCHTTPMethod([httpPOST])]
    [MVCDoc('Create a new user, returns the id of the new user')]
    procedure CreateUser(CTX: TWebContext);

  end;
 
implementation

uses
  MyTransactionScript; //contains actual data access code
  
{ TUsersController }
 
procedure TUsersController.GetUsers(CTX: TWebContext);
var
  User: TUser;
begin
  User := GetUserById(CTX.Request.Parameters['id'].ToInteger);
  Render(User);
end;

procedure TUsersController.UpdateUser(CTX: TWebContext);
var
  User: TUser;
begin
  User := CTX.Request.BodyAs<TUser>;
  SaveUser(User);
  Render(User);
end;	
  
procedure TUsersController.CreateUser(CTX: TWebContext);
var
  User: TUser;
begin
  User := CTX.Request.BodyAs<TUser>;
  CreateUser(User);
  Render(User);
end;	
  
end.

Now you have a performant RESTful server wich respond to the following URLs:

  • GET /users/($id) (eg. /users/1, /users/45 etc)
  • PUT /users/($id) (eg. /users/1, /users/45 etc with the JSON data in the request body)
  • POST /users (the JSON data must be in the request body)

###Quick Creation of DelphiMVCFramework Server

If you dont plan to deploy your DMVCFramework server behind a webserver (apache or IIS) you can also pack more than one server into one single executable. In this case, the process is a bit different and involves the creation of a server container. However, create a new server is a simple task:

uses
  MVCFramework.Server;

var
  ServerInfo: IMVCServerInfo;
  Server: IMVCServer;
begin
  ServerInfo := TMVCServerInfoFactory.Build;
  ServerInfo.ServerName := 'MVCServer';
  ServerInfo.Port := 4000;
  ServerInfo.MaxConnections := 1000;
  //You must reference your TWebModuleClass  
  ServerInfo.WebModuleClass := YourServerWebModuleClass;

  Server := TMVCServerFactory.Build(ServerInfo);
  Server.Start;
  Server.Stop;
end;

If you want to add a layer of security:

uses
  MVCFramework.Server;

var
  ServerInfo: IMVCServerInfo;
  Server: IMVCServer;
  OnAuthentication: TMVCAuthenticationDelegate;
begin
  ServerInfo := TMVCServerInfoFactory.Build;
  ServerInfo.ServerName := 'MVCServer';
  ServerInfo.Port := 4000;
  ServerInfo.MaxConnections := 1000;
  //You must reference your TWebModuleClass  
  ServerInfo.WebModuleClass := YourServerWebModuleClass;

	OnAuthentication := procedure(const pUserName, pPassword: string; pUserRoles: TList<string>; var pIsValid: Boolean)
	begin
	   pIsValid := pUserName.Equals('dmvc') and pPassword.Equals('123');
	end;

  ServerInfo.Security := TMVCDefaultSecurity.Create(OnAuthentication, nil);

  Server := TMVCServerFactory.Build(ServerInfo);
  Server.Start;
end;

//And in his WebModule you should add the security middleware
uses
	MVCFramework.Middleware.Authentication;

procedure TTestWebModule.WebModuleCreate(Sender: TObject);
begin
	MVCEngine := TMVCEngine.Create(Self);
	
	// Add Yours Controllers
	MVCEngine.AddController(TYourController);
	
	// Add Security Middleware
	MVCEngine.AddMiddleware(TMVCBasicAuthenticationMiddleware.Create(Server.Info.Security));
end;  

You can work with a container of DelphiMVCFramework servers:

uses 
  MVCFramework.Server;

var
  ServerOneInfo: IMVCServerInfo;
  ServerTwoInfo: IMVCServerInfo;
  Container: IMVCServerContainer;
begin
  Container := TMVCServerContainerFactory.Build();

  ServerOneInfo := TMVCServerInfoFactory.Build;
  ServerOneInfo.ServerName := 'MVCServer1';
  ServerOneInfo.Port := 4000;
  ServerOneInfo.MaxConnections := 1000;
  ServerOneInfo.WebModuleClass := ServerOneWebModuleClass;

  Container.CreateServer(ServerOneInfo);

  ServerTwoInfo := TMVCServerInfoFactory.Build;
  ServerTwoInfo.ServerName := 'MVCServer2';
  ServerTwoInfo.Port := 5000;
  ServerTwoInfo.MaxConnections := 1000;
  ServerTwoInfo.WebModuleClass := ServerTwoWebModuleClass;
  Container.CreateServer(ServerTwoInfo);
  Container.StartServers();
end;  

###Links Feel free to ask questions on the "Delphi MVC Framework" facebook group (https://www.facebook.com/groups/delphimvcframework).

http://www.danieleteti.it/2013/04/18/sneak-peek-to-simple-integration-between-dmvcframework-and-dorm/

delphimvcframework's People

Contributors

danieleteti avatar ezequieljuliano avatar khoffrath avatar nickhodges avatar spinettaro avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.