Laravel: From Apprentice To Artisan (TR) Türkçe



Benzer belgeler
Laravel 4 Türkçe Dokümantasyon (v. 4.2) (Ücretsiz)

Implementing Laravel (TR) Türkçe Çevirisi

PHP İle Paket Geliştirme

Laravel 4 Türkçe Dokümantasyon (v. 4.1) (Ücretsiz)

Nefret Etmeyeceğiniz Uygulama Programlama Arayüzleri (API) İnşa Edin

CAN TECİM HEDEF DENEYİM. Tecrübe bütün öğretmenlerin en iyisidir. Publilus Syrus

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Turquaz. Açık kodlu muhasebe yazılımı Turquaz Proje Grubu

Web Uygulamaları Mimarileri ve Güvenliği

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Spring Giriş Eğitimi

Bugün Ne Oldu Bir Bilsen

Ders 8 Konu Özeti ve Problemler

1 Milyon Kullanıcıya Nasıl Hizmet Veriyoruz? CloudLMS Teknik Alt Yapı ve Mimarimiz

MVC. Görüldüğü üzere 2 adet cs. Dosyası oluşturdum. Birincisi çok satır kodu (20-25) içeren büyük işlerin yapılacağı class. İsmi buyuk_isler.

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

.com. Özcan Acar 2009 Kurumsal Java.com

1 FULL STACK DEVELOPMENT NEDIR? 1 Nasıl Full Stack Developer Olurum? 2

INTERNET SİTESİ KULLANIM KILAVUZU

İŞ ZEKÂSI & ÇEVİK RAPORLAMA ARACI. REPX ile verinize değer katın.

JAVA RMI ve Hibernate teknolojileri kullanılarak çok amaçlı bir yazılım altyapısı hazırlanması

Laravel 4 Cookbook (TR)

MVP, Observer ve Mediator Örüntüleri ile Yeniden Kullanılabilir Uygulama Bileşenleri Geliştirme

RoboGuice ve Android Annotations ile Verimli Android Uygulama Geliştirme Emrah Ayanoğlu, Onur Özcan, Alperen Eraslan. Inet-TR 12 9 Kasım 2012

TÜRKSAT A.Ş. 2. PostgreSQL Konferansı. Bilgilendirme Sunumu Faruk Selman Lekesiz

Sadece 2 İstekle MySQL Blind SQL Injection. Canberk BOLAT canberk.bolat[-at-]gmail[-dot-]com

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Swing ve JDBC ile Database Erişimi

Java ile Tasarım Prensipleri ve Tasarım Örüntüleri

Mutlu Müşteriler. Kararsız Müşteriler. Mutsuz Müşteriler

Gönderilen uygulama incelendiğinde, belirtilen gerekliliklerin bir kısmının karşılandığı görülmüştür.

Spring Ekosisteminde Kurumsal Yazılım Geliştirme. Kenan Sevindik Harezmi Bilişim Çözümleri A.Ş.

BitTorrent İstemci Kullanımı

İNTERNET PROGRAMCILIĞI HAFTA MYSQL - PHPMYADMIN. Hazırlayan Fatih BALAMAN. İçindekiler. Hedefler. Mysql Nedir.

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

Spring Framework Eğitimi

Basit bir web uygulaması

Script. Statik Sayfa. Dinamik Sayfa. Dinamik Web Sitelerinin Avantajları. İçerik Yönetim Sistemi. PHP Nedir? Avantajları.

Her Yönüyle SQL Enjeksiyonu. OWASP-Türkiye Bünyamin Demir

Java Dersi. Altuğ Bilgin Altıntaş

Client Server Database

Laravel: Code Bright (TR) Türkçe

Örnek bir kullanım ve bilgisayar ağlarını oluşturan bileşenlerin özeti

CENG 302 Yazılım Mühendisliği Yazılım Mimarisi - Devam. Alper UĞUR

Üst Düzey Programlama

Basit Mimari, Katmanlı Mimari ve doğrudan çalıştırma olarak üçe ayrılır.

PHP 1. Hafta 2.Sunum

LKD Kendi İlacını Kullanıyor

Laravel 4 Türkçe Dokümantasyon

Proje de saga tıklayıp new diyoruz. Normal java classı kullanacağız.swing kullanmayacağız.

İnternet Programcılığı

Cahit GÜNGÖR Hacettepe Üniversitesi Bilişim Enstitüsü. Sorumluluk Zinciri. Kod Üretme (Code Generation)

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Kırklareli Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır.

AKILLI TATIL PLANLAMA SISTEMI

MANGAHIGH.COM. tanıtım kitapçığı ALKEV İLKÖĞRETİM OKULU MATEMATİK BÖLÜMÜ

Firma Yazılımı v2.00 Kullanım Kılavuzu

ÖZGÜR YAZILIMLAR İLE J2EE

Epay, Turkcell MobilÖdeme Altyaps

Mobil Uygulama Geliştirme Yaklaşımları, Web Tabanlı Mobil Uygulama Çatıları. Burak USGURLU

License. Veri Tabanı Sistemleri. Konular büyük miktarda verinin etkin biçimde tutulması ve işlenmesi. Problem Kayıt Dosyaları

Sade ve tam ekran masaüstü kullanımının temel çıkış noktası, aranılan özelliğe çabuk erişimi sağlayan yenilikçi kullanıcı deneyimidir.

Akıllı telefonlar, avuçiçi bilgisayarlar ile taşınabilir (cep) telefonların özelliklerini birleştiren cihazlardır. Akıllı telefonlar kullanıcıların

SAMET ÇİLLİ. Kıdemli Yazılım Uzmanı Üsküdar, İstanbul

JetSMS Direct Çözümü

BÖLÜM 3 OPERAT A ÖRLER

PHP CodeIgniter MVC Framework

Güvenlik Java ve Web Uygulama Güvenliği

NESNEYE YÖNELİK PROGRAMLAMA

GAZBETONLU. HAFİF ÇELiK YAPI. SiSTEMLERİ

Spring Application Framework Harezmi Bilişim Çözümleri

Kaynak Kod Güvenliği Bir Güvensiz API Örneği

Üst Düzey Programlama

Symfony Doctrine. Symfony-Doctrine. Deniz Bahadr GÜR, Mehmet Onur YALAZI. Özgür Web Teknolojileri Günleri, 2010

FINDIK Herkese Açık Filtre

Heat Treatment Management

Android e Giriş. Öğr.Gör. Utku SOBUTAY

Twitter Nedir? Nasıl Kullanılır? Mehmet Nuri Çankaya

Daha genişbantlı, tamamen mobil

İNTERNET PROGRAMCILIĞI - II

Bu classı biraz açıklamak gerekirse, tam olarak şu işleri yapıyor.

Uluslararası Caribou Matematik Yarışması

YZM 3215 İleri Web Programlama

BİL-141 Bilgisayar Programlama I (Java)

1 Temel Kavramlar. Veritabanı 1

Bİ L 131 Hafta 2. 1) Bilgisayara Java SE Development Kit 7 kurulması

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

Mobil Cihazlardan Web Servis Sunumu

DIGITURK PLAY PLUS PROMOSYON KODU KULLANMA KLAVUZU. LG TÜRKİYE V2.0 Temmuz 2015

Yazılım Mühendİslİğİ ve Günümüz PHP Programcılığı

Tavsiye Edilen Önhazırlık Temel veritabanı kavramlar hakkında bilgi sahibi olmak. Hedefler Temel veritabanı güvenlik işlemlerini gerçekleştirebilmek

Yetersiz Şifre Politikasının Sonuçları

Sunum Planı. Django Nedir? Django projesi oluşturmak Basit bir blog uygulaması. Şablon Kullanımı Diğer özellikleri

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MOBİL UYGULAMALAR DERSİ PROJE ÖDEV İÇERİĞİ

Transkript:

Laravel: From Apprentice To Artisan (TR) Türkçe Laravel 4 İle İleri Düzey Uygulama Mimarisi Taylor Otwell ve Sinan Eldem Bu kitap http://leanpub.com/laravel-4-tr adresinde satıştadır. Bu versiyon, 2015-08-29 tarihinde yayınlanmıştır This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. 2013-2015 Taylor Otwell ve Sinan Eldem

Bu Kitabı Tweet le! Yazara, Taylor Otwell ve Sinan Eldem, destek olmak için bu kitabı Twitter da paylaşın! Bu kitap için önerilen hashtag #laravel-4-tr. Bu linke tıklayarak, Twitter da bu kitap hakkında neler paylaşıldığını görebilirsiniz: https://twitter.com/search?q =#laravel-4-tr

İçindekiler Bağımlılık Enjeksiyonu...................................... 1 Problem............................................. 1 Bir Sözleşme İnşa Edin..................................... 2 Daha İlerisi........................................... 4 Çok Mu Java Tarzı?....................................... 6

Bağımlılık Enjeksiyonu Problem Laravel framework ün temeli, onun güçlü IoC konteyneridir. Frameworkün gerçek anlamda anlaşılabilmesi için, konteynerin güçlü bir şekilde kavranması gerekmektedir. Bununla birlikte, bir IoC konteynerinin sadece bir yazılım tasarım deseni (dependency injection) gerçekleştirmek için kolaylık sağlayan bir mekanizma olduğunu belirtmeliyiz. Bağımlılık enjeksiyonunu gerçekleştirmek için bir konteyner zorunlu değildir, sadece bu görevi daha kolay hale getirir. İlk olarak, bağımlılık enjeksiyonunun neden faydalı olduğunu inceleyelim. Aşağıdaki sınıfı ve metodu ele alalım: 1 class UserController extends BaseController { 2 3 public function getindex() 4 { 5 $users = User::all(); 6 7 return View::make('users.index', compact('users')); 8 } 9 10 } Bu kod özlü olsa da, gerçek bir veritabanı olmaksızın onu test edemeyiz. Diğer bir deyişle Eloquent ORM, controller imizle sıkıca bağlanmış tır. Ayrıca, canlı bir veritabanına ulaşım da dahil olmak üzere bütün Eloquent ORM yi kullanmadan da bu controller i test etme imkanımız yoktur. Bu kod çoğunlukla separation of concerns (ilgilerin ayrılığı) adı verilen bir yazılım tasarım ilkesini de ihlal etmektedir. Basitçe söylemek gerekirse: controller imiz çok şey biliyor. Controller lerin verilerin nereden geldiğini bilmesine gerek yoktur, sadece ona nasıl ulaşacağını bilmesi gerekir. Bir controller in verinin MySQL de olduğunu bilmesine gerek yoktur, sadece onun bir yerlerde bulunuyor olduğunu bilmesi gerekir. Separation Of Concerns (İlgilerin Ayrılığı) Her sınıfın tek bir sorumluluğu olmalıdır ve bu sorumluluk sınıf tarafından tam olarak enkapsüle edilmiş olmalıdır.

Bağımlılık Enjeksiyonu 2 Bu yüzden, web katmanımızın (controller) veri erişim katmanımızdan tamamen ayrı tutulması bizim için yararlı olacaktır. Bu bizim depolama uygulamalarımızda kolayca geçişler yapabilmemizi, bunun yanında kodun test edilebilirliğini de kolaylaştırmamızı sağlayacaktır. Web i sadece gerçek uygulamanıza bir ulaştırma katmanı olarak düşünün. Uygulamanızı çeşitli kablo girişleri olan bir monitör olarak hayal edin. Monitörün işlevselliğine HDMI, VGA veya DVI aracılığı ile erişebilirsiniz. İnterneti de uygulamanıza giren bir kablo olarak düşünün. Bir monitörün işlevselliğinin hacmi kablodan bağımsızdır. Kablo tıpkı HTTP nin sizin uygulamanız için bir ulaştırma katmanı olması gibi sadece bir ulaştırma mekanizmasıdır. Bu yüzden, ulaştırma mekanizmamızı (controller) uygulama mantığımızla kaplamak istemeyiz. Bu, bir API ya da mobil uygulama gibi herhangi bir ulaştırma katmanının uygulama mantığımıza ulaşmasına imkan verecektir. Bu yüzden, controller imizi Eloquent ORM ye kaplatmak yerine, bir repository (ambar) sınıfı enjekte edelim. Bir Sözleşme İnşa Edin Öncelikle bir interface ve ona karşılık gelen bir implementation tanımlayacağız: 1 interface UserRepositoryInterface { 2 3 public function all(); 4 5 } 6 7 class DbUserRepository implements UserRepositoryInterface { 8 9 public function all() 10 { 11 return User::all()->toArray(); 12 } 13 14 } Sonra da controller imize bu interface in bir implementation unu enjekte edeceğiz:

Bağımlılık Enjeksiyonu 3 1 class UserController extends BaseController { 2 3 public function construct(userrepositoryinterface $users) 4 { 5 $this->users = $users; 6 } 7 8 public function getindex() 9 { 10 $users = $this->users->all(); 11 12 return View::make('users.index', compact('users')); 13 } 14 15 } Artık controller imiz user verisinin nerede saklandığı konusunda tamamen bilgisizdir. Böyle bir durumda, cehalet mutluluktur! Verilerimiz MySQL, MongoDB veya Redis ten geliyor olabilir. Controller imiz bu farkı bilmediği gibi önemsemez de. Sadece bu küçük değişikliği yapmakla, web katmanımızı veri katmanımızdan bağımsız olarak test edebildiğimiz gibi, depolama implementasyonlarımızı da kolayca değiştirebiliriz. Saygı Sınırları Sorumluluk sınırlarına saygı göstermeyi unutmayın. Controllerler ve rotalar HTTP ile uygulamanız arasında bir aracı olarak hizmet ederler. Büyük uygulamalar yazarken, bunları domain mantığınızla kaplamayın. Anlaşılmasını kuvvetlendirmek için en iyisi hızlı bir test yazalım. İlk olarak repository yi mock (taklit) edeceğiz ve onu uygulama IoC konteynerine bağlayacağız. Sonra da, controllerin bu repository yi düzgün bir biçimde çağırdığından emin olacağız:

Bağımlılık Enjeksiyonu 4 1 public function testindexactionbindsusersfromrepository() 2 { 3 // Arrange... 4 $repository = Mockery::mock('UserRepositoryInterface'); 5 $repository->shouldreceive('all')->once()->andreturn(array('foo')); 6 App::instance('UserRepositoryInterface', $repository); 7 8 // Act... 9 $response = $this->action('get', 'UserController@getIndex'); 10 11 // Assert... 12 $this->assertresponseok(); 13 $this->assertviewhas('users', array('foo')); 14 } Beni Taklit Ediyor Musunuz? Bu örnekte, Mockery taklit etme kitaplığını kullandık. Bu kitaplık sınıflarınızı taklit etmede temiz, etkileyici bir interface sağlar. Mockery, Composer aracılığıyla kolaylıkla yüklenebilir. Daha İlerisi Öğrendiklerimizi daha da kuvvetlendirmek için başka bir örneği ele alalım. Belki müşterilerimizi hesaplarına yapılan ücretlendirmeler konusunda bilgilendirmek istiyoruz. İki tane interface veya sözleşme tanımlayacağız. Bu sözleşmeler bize bunların implementation larını daha sonra değiştirebilme esnekliği verecektir. 1 interface BillerInterface { 2 public function bill(array $user, $amount); 3 } 4 5 interface BillingNotifierInterface { 6 public function notify(array $user, $amount); 7 } Sonra da, BillerInterface sözleşmemizin bir implementasyonunu inşa edelim:

Bağımlılık Enjeksiyonu 5 1 class StripeBiller implements BillerInterface { 2 3 public function construct(billingnotifierinterface $notifier) 4 { 5 $this->notifier = $notifier; 6 } 7 8 public function bill(array $user, $amount) 9 { 10 // Stripe aracılıyla faturala... 11 12 $this->notifier->notify($user, $amount); 13 } 14 15 } Her sınıfın sorumluluklarını ayırmak suretiyle, şimdi faturalama sınıfımıza kolaylıkla çeşitli bilgilendirme implementasyonları enjekte edebileceğiz. Örneğin, bir SmsNotifier veya bir EmailNotifier enjekte edebiliriz. Fatura kesicimiz artık bilgilendirme implementasyonu ile ilgilenmeyecek, sadece bilgilendirme sözleşmesiyle ilgilenecek. Bir sınıf, sözleşmesine (interface) riayet ettiği sürece, fatura kesicimiz bu sınıfı memnuniyetle kabul edecektir. Üstelik, sadece esneklik elde etmekle kalmayacağız, şimdi bir taklit BillingNotifierInterface enjekte etmek suretiyle fatura kesicimizi bilgilendiricilerden izole bir şekilde test edebileceğiz. Interface (Arayüz) Olun Arayüz yazılması fazladan birçok iş gibi görünebilir, bunlar gerçekte geliştirmenizi daha hızlı hale getirebilirler. Tek bir satır implementation yazmadan önce uygulamanızın tüm back-end ini mock ve test etmek için interface leri kullanın! Peki, bağımlılık enjeksiyonunu nasıl yaparız? Cevabı basit: 1 $biller = new StripeBiller(new SmsNotifier); İşte bağımlılık enjeksiyonu. Fatura kesicinin kullanıcıların bilgilendirilmesiyle ilgileniyor olması yerine, ona sadece bir bilgilendirici geçiyoruz. Bu basit değişiklik, uygulamanız için inanılmaz şeyler yapabilecektir. Sınıf sorumlulukları açıkça betimlendiği için, kodunuz anında daha sürdürülebilir hale gelir. Ayrıca, test altındaki kodunuzu izole etmek için taklit bağımlılıkları kolaylıkla enjekte edebileceğiniz için test edilebilirlik de yükseklere fırlayacaktır. Fakat IoC konteynerlerinden ne haber? Bağımlılık enjeksiyonu yapmak için bunlar gerekmiyor mu? Kesinlikle hayır! Sonraki bölümlerde göreceğiniz üzere, konteynerler bağımlılık enjeksiyonu

Bağımlılık Enjeksiyonu 6 yönetimini kolaylaştırırlar ama bir gereklilik değildirler. Bu bölümdeki ilkeleri takip etmek suretiyle, bir konteyneriniz olup olmadığına bakmaksızın herhangi bir projenizde bağımlılık enjeksiyonu uygulayabilirsiniz. Çok Mu Java Tarzı? PHP de interface kullanımına sık yapılan bir eleştiri, kodunuzu Java ya çok benzer bir hale getirdiğidir. Bu insanların demek istediği, kodu çok gereksiz şeylerle dolduracağıdır. Bir interface ve bir implementation tanımlamak zorundasınız, bu da fazladan tuş dokunuşları demektir. Küçük, basit uygulamalar için bu eleştiri belki geçerli olabilir. Interface ler bu uygulamalar için çoğu keresinde gereksizdir ve kendinizi sadece değişmeyeceğini bildiğiniz bir implementasyona bağlamaya TAMAM diyebiliriz. İmplementasyonunuzun değişmeyeceğinden eminseniz, interface kullanmanıza gerek yoktur. Mimari astronotları asla emin olamayacağınızı söylüyorlar. Fakat, gelin yüzleşelim, bazen emin olabilirsiniz. Büyük uygulamalar için, interface ler çok yardımcıdırlar ve kazanacağınız esneklik ve test edilebilirlikle kıyaslandığında fazladan bir şeyler yazmış olma çok sönük kalır. Bir sözleşmenin implementasyonlarının çok çabuk takas edebilebilmesi yöneticinize vay be dedirtecek ve değişikliklere kolayca adapte olabilen kodlar yazmanıza imkan verecektir. Böylece, sonuç olarak, bu kitabın çok saf bir mimari sunduğunu aklınızda tutun. Şayet onu tekrar küçük bir uygulama için ölçeklendirmeniz gerekirse, suçluluk hissetmeyin. Unutmayın, biz hepimiz mutlu kodlar için çalışıyoruz. Yaptığınız şeyden zevk almıyorsanız veya programlamanızdan suçluluk duyuyorsanız, durun ve yeniden değerlendirin.