Play Framework MVC

Merhaba arkadaslar, bu yazımıda Play MVC yapısına değinmeye çalışacağız.

Play Framework MVC

MVC, web applicationların daha düzenli, anlaşılır bir yapıda olmasını sağlayan, görev ve sorumlulukların net olarak belirlenmesine imkan veren bir yaklaşım/tarzdır.

MVC, ModelViewController olarak web uygulamanızı daha iyi yönetebilmenizi sağlar. MVC hakkında bilgi almak için şuraya bakabilirsiz : Wiki-MVC

Asıl konumuz olan Play’de MVC nasıl işliyor ona bakalım;

Screenshot from 2016-03-12 11:08:38

 

Temel bir HTTP isteğinin handle edilmesi sürecini yukarıda kısmen görebilirsiniz. Play, Model, View ve Controller’a ek olarak Router bilgisini içerir. Bu yüzden Play’deki mvc mimarisini kendimce RMVC olarak ifade ediyorum. Sebebi de herhangi bir http isteğinin handle edilme sürecinde muhakkak router’a uğranılmasıdır.

Bir HTTP isteğinin Play içerisindeki serüveni aşağıda ifade edilmiştir;

  1. Client, herhangi bir kaynak için istekte bulunur.
  2. Play, Router’da gelen isteğin router configürasyonunda tanımlı bir kaynak olup olmadıgını kontrol eder.
  3. Eğer valid bir http isteği ise router’daki action’a yönlendirilir, eğer invalid ise action not found hatası döner.
  4. Valid olan isteğin işlenmesi action tarafından gerçekleştirilir. Actionlar, Controller içerisinde yer alır. Controller’lar, birden fazla action içerebilir.
  5. Action model ile etkileşime geçer ve views’ı render eder.
  6. Render edilen view client’a gönderilir. Burada view, html, img vs herhangi birşey olabilir.

İnvalid bir request’te play hata üretecektir;

Screenshot from 2016-03-20 13:20:21

RouterMVC(Router)

Play içerisindeki önemli bir parçadır, HTTP requestin ilk uğradıgı noktadır. conf/ dizini altında yer alan routes.conf dosyasıdır. Configürasyonda tanımlı olmayan hiç bir kaynağa client erişemez. conf dosyası Http isteği hakkında bilgiler içeren satırlardan oluşmaktadır.

Routes configürasyonu içerisinde ki bir satır 3 kısımdan oluşur;

  1. HTTP method type
  2. URL
  3. Action

Örnek bir konfigürasyonuna bakalım;

Http POST methodu ile /add url’ine bir istek yapıldıgında, play bu isteği PersonController Controller’ı içerisindeki add actionuna yönlendirilecektir. Eğer POST dısında herhangi bir Http method tipi ile gitmeye çalışırsak action not found hatası alacagız.

Dynamic  url’ler icin regex de kullanabiliriz.

Url’deki query paramları acitona yönlendirebiliriz. id: Integer ile tipini de yazarak iletebiliriz. Tipi değişken olabilir.

Yine default value de kullanabiliriz;

NOT : Bir action için aynı anda birden fazla Http method tipi yazılamıyor. Yaptıgım arastırmalarda hiç biryerde buna dair birsey bulamadım. POST, GET olacak sekilde conf düzenledim ancak hata aldım. Desteklemiyordur muhtemelen ama desteklese güzel olurdu, bazı durumlarda işe yarayabilirdi. Bilen bir arkadasımız var ise bilgisini paylaşsın lütfen

Not : Eğer olmayan bir aciton verirseniz compile error alıcaksınız. Play’de her sey compile edilir, bunu unutmayalım. Buna style dosyaları olsun, conf dosyaları vs olsun, Hersey!

Compile olan router configürasyonuna bakalım;

Çok birşey ifade etmese de bizim için en azından herseyin compile edildigini göstermis oldum

Router içerisindeki HTTP methodundan sonra isteğin url mappingi yapılır. Static ve dynamic url imlanı vardır. /add static bir url tanımı iken /delete/:id ve /assets/*file tanımları dynamictir.

 

Controller

HTTP requestlerin handle edildigi kısımdır. Bir Java classından farksız degildir. Controller’lar action’lardan olusur, bir controller birden fazla action içerebilir. Bir Java class’ının controller olabilmesi icin play.mvc paketi altındaki abstract olan Controller class’ını extends etmesi gerekmektedir. PersonController’a bakalım;

Controller sınıfının yapısına bakalım;

play.mvc.Controller

Controller class’ı da Results’ı extend, Status ve HeaderNames gibi http için gerekli status kodları ve header bilgilerini(charset, encoding vs) içerir. Results class’ına bakalım;

Results sayesinde ok, notfound gibi hazır cevaplar ile response dönebiliriz, default charset UTF-8’dir.

Assets Controller

Assets, default olarak gelen özel bir controller’dır. Public kaynakların servis edilmesinden sorumludur. at action’u özel bir actiondur ve iki parametre alır. /public parametresi servis edilecek dizini ifade eder, url’deki dynamic file parametresi ise dosyanın adıdır. *file ifadesi .* ile aynıdır.

Örn : /assets/js/main.js url’i geldiginde play public dizini için lok-up yaparak js dosyasını bulur. /js/main.js at actionundaki file parametresine denk gelmektedir.

Models

MVC’deki veri şablonunu ihtiva eder. Default olarak models paketi altında yer alır. Play, default olarak ORM için ebean denen bir yapıyı kullanıyor. build.sbt içerisinde bunu enabled etmek gerekir, şöyle;

/project/plugib.sbt içerisine şunu;

build.sbt içerisine şunu;

Ebean default olarak model class’larını models paketi altında arayacaktır. conf/ dizini altındaki application.conf içerisinde ebean tanımının şu şekilde olması gerekir;

Bir model olan person’a bakalım;

Model olabilmesi için classın com.avaje.ebean.Model‘den extends edilmesi gerekir.

Ebean, default olarak transaction kullanır. JPA’ya benzder, kolayca save, update vs gibi işlemler yapılabilir. Yapısı ve özellikler gayet hoş. Daha fazla bilgi için : Ebean

Views

Play, views’ı template’lerle çözmeye çalışır. Play template engine olarak Twirl(https://github.com/playframework/twirl) kullanır. Öğrenmesi basit, yeni bir yapı olmayan ve kolayca bir editörde yazabileceginiz, temiz syntax’lı bir template engine’dir. Yine kullanabilmek için plugin.sbt’ye şunu eklemek gerekir;

Template dosyası import ifadelerini içerebilir, parametre alabilir, diğer template’leri kullanabilir.

Örnek template’a bakalım;

index.scala.html template dosyası parametre olarak String tipinde bir message almaktadır. @ karekteri özel bir karekterdir. Birden fazla parametre tanımı yapılabilir;

views/ dizini altında yer alan index.scala.html template’i compile olarak views.html.index dosyasını olusturacaktır ve render() methodunu içerecektir. Compile olan template’i kullanmak icin de Controller içerisinde import views.html.index; şeklinde import ederek kullanılabilir. Parametre olarak object yada primitive tip veri gönderilebilir.

@main kısmı ile bir diğer template’ı çağırmaktadır. Ayrıca @play20 ile yine hazır bir template’i kullanmaktayız.

Screenshot from 2016-03-20 17:02:42

 

İfadesi default gelen ifadedir, Play dokumantasyonunu, apini vs gösteren bir sayfa render eder. Eğer şu şekilde template’ı degistirirsek sadece mesajı render edecektir;

Screenshot from 2016-03-20 17:01:57

Template içerisinde degisken tanımlayabilir, if vs blokları tanımlayabilir, diğer template’leri include edebilirsiniz.

Parametre de default deger de kullanabilirsiniz, şöyle;

Tüm anlattgımız bu yapıları örnek bir Play uygulaması yazımızda kullanıp, pratik olarak da gösterecegiz.

Yazıyı burada sonlandırıyorum arkadaslar, mutlu ve saglıcakla kalın.

~ A.Akkus

 

668 Total Views 1 Views Today