Delphi MVC Framework Mathias Pannier
Über mich Name: Mathias Pannier Position: Softwareentwickler/Teamleiter Mehr als 15 Jahre Erfahrung mit Softwareentwicklung in Delphi Blog:
DMVCFramework Delphi MVC Framework -is a powerful framework for web solution in Delphi(Quelle: https://code.google.com/p/delphimvcframework/) Delphi Units für die Entwicklung von Web Diensten (REST Server/Clients) Website: https://github.com/danieleteti/delphimvcframework Supportsite: https://www.facebook.com/groups/delphimvcframework
DMVCFramework Hauptentwickler und Initiator ist Daniele Teti (http://www.danieleteti.it- Autor von Delphi Cookbook) Im Delphi Cookbookgibt es einige Abschnitte über das DMVCFramework Derzeit 4 Entwickler Erster Stand in einem öffentlichen Repository vom 29.10.2013 Letztes update vor ein paar Tagen (Januar 2016) läuft ab Delphi XE3 aufwärts
Features Simple to use (really) RESTful (RMM Level 3) compliant Fancy URL with parameter mappings** Specialized renders to generate text, html, json** Powerful mapper to map jsonto objects and datasets to objects** Can be packaged as stand alone server, apache module (XE6 or better) and ISAPI dll
Features Integrated RESTClient Messaging extension using STOMP Load balancing and cache using REDIS It use Embarcadero WebBrokerbut is not tied to it Designed with services and web client app in mind Server side generated pages using Mustache (in the past elua) Uvm. Quelle: https://github.com/danieleteti/delphimvcframeworkund https://github.com/danieleteti/delphimvcframework/blob/master/docs/itdevco N%202013%20-%20Introduction%20to%20DelphiMVCFramework.pdf
REST RepresentationalState Transfer bezeichnet ein Programmierparadigma für verteilte Systeme, insbesondere für Webservices... REST hat das Ziel einen Architekturstil zu schaffen, der besser die Anforderungen des modernen Web darstellt Prinzipien: Client-Server, Zustandslosigkeit, (HTTP) Caching, einheitliche Schnittstelle (URL, HTTP Verben, JSON, HATEOAS Navigation über URLs), mehrschichtige Systeme Quelle: https://de.wikipedia.org/wiki/representational_state_transfer
Architektur eine Anwendung (EXE oder ISAPI DLL) mehrere Controller (TMVCController) mehrere Aktionen pro Controller (Methoden) Controller, Aktionen und deren Parameter sind Bestandteil der URL die aufgerufen wird www.myserver.com/blog/posts/123
1. Beispiel - Delphi WebBroker Anwendung (ISAPI/EXE) type TWebModule1 = class(twebmodule) procedure WebModuleCreate(Sender: TObject); private DMVC: TMVCEngine; end; proceduretwebmodule1.webmodulecreate(sender: TObject); begin DMVC := TMVCEngine.Create(self); DMVC.AddController(TBlogController); end;
1. Beispiel Der Controller type [MVCPath('/blog')] TBlogController = class(tmvccontroller) public [MVCPath('/posts/($id)')] procedure GetPostByID(CTX: TWebContext); end; implementation procedure TBlogController.GetPostByID(CTX: TWebContext); var ablogpost: TBlogPost; begin ablogpost := LoadFromDataBaseByID(CTX.Request.Parameters['id'].ToInteger); Render(aBlogPost); end;
Parameter CTX.Request.Params['id'] URL Parameter Query String Parameter Form Parameter (HTML Form Submit) Cookie Felder Bsp.: www.myserver.com/blog/posts/123 www.myserver.com/blog/posts?id=123
Renderer Methoden des Controllers um den Response (Stream) zu produzieren Siesetzenden HTTP Status Code und den Content Type Verfügbare Renderer Text, DataSets, JSONValues, Delphi Objects, List of Delphi Objects, Exceptions, HTML pages using Mustache, Raw Streams
Renderer Beispiel procedure TBlogController.GetPostByID(CTX: TWebContext); var ablogpost: TBlogPost; begin ablogpost := TBlogPost.Create; ablogpost.id := CTX.Request.Parameters['id'].ToInteger; ablogpost.title := 'Hallo Welt'; ablogpost.body := 'Dies ist ein Test'; ablogpost.createdate := Now(); ablogpost.author := 'Mathias Pannier'; Render(aBlogPost); end; procedure TBlogController.GetPostByID(CTX: TWebContext); begin DataSet1.SelectSQL.Add('select * from BLOG_POSTS where ID = :ID'); DataSet1.Params[0].AsInteger := CTX.Request.Parameters['id'].ToInteger; DataSet1.Open; Render(DataSet1); end;
Mapper "Konverter" für Delphi Objekte, JSon und DataSets Bsp.: ObjectToJSONObject JSONObjectToObject DataSetToJSONArray JSONArrayToDataSet... Können auch unabhängig vom Web - Framework verwendet werden
Mapper Beispiel procedure TForm1.Button1Click(Sender: TObject); var ablogpost: TBlogPost; begin ablogpost := TBlogPost.Create; ablogpost.id := 1; ablogpost.title := 'Hallo Welt'; ablogpost.body := 'Dies ist ein Test'; ablogpost.createdate := Now(); ablogpost.author := 'Mathias Pannier'; ShowMessage(Mapper.ObjectToJSONObjectString(aBlogPost)); ablogpost.free; end;
Demo
Alternativen von Hand mit den Indy Komponenten DataSnap(Embarcadero; in Delphi integriert) mormot Framework TMS XData kbmmw RemObjects Usw.
Warum DMVC Leichtgewichtig, Klein, Schnell Einfach zu benutzen OpenSource "näher dran" an REST/Webentwicklung/HTTP Mapper/Renderer unabhängig nutzbar Performance und Stabilität von DataSnap... (https://robertocschneiders.wordpress.com/2012/11/22/datasnapanalysis-based-on-speed-stability-tests/)
Fragen?