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



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

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

PHP İle Paket Geliştirme

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

Sunum İçeriği. Programlamaya Giriş

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

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

Android Ders Notları

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Üst Düzey Programlama

19 Şubat 2016 Cuma

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ

Spring Giriş Eğitimi

Listview Kullanımı. Aşağıdaki örnekte bir ListView'ı birkaç ülke ismiyle dolduracağız.

BİL-141 Bilgisayar Programlama I (Java)

7. HAFTA. Erişim Belirleyiciler

BIND ile DNS Sunucu Kurulumu

Business Delegate Tasarım Şablonu KurumsalJava.com

C# ile e-posta Göndermek

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

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

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.

Decorator Tasarım Şablonu

Loose Coupling (LC) Esnek Bağ Tasarım Prensibi KurumsalJava.com

Adım Adım Windows 2000 Server Kurulumu 11 Cuma, 08 Eylül :32 - Son Güncelleme Cumartesi, 12 Eylül :45

AirTies Kablosuz Erişim Noktası (Access Point) olarak kullanacağınız cihazı bilgisayarınıza bağlayarak ayarlarını yapabilirsiniz.

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Proje 1. Arayüz Tasarımı

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Erişim konusunda iki taraf vardır:

Scream! e gelen veri akışlarından bazılarını diğer bir kurum yada bilgisayarla paylaşmak için kullanılabilir.

BİL-142 Bilgisayar Programlama II

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

VMware 4.0 vcenter Server Kurulumu

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.

Burak Kıymaz JAVA FX

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

Bo lu m 7: Hesap Tabloları

Java da İstemci Tarafı Uygulamalar

Intercepting Filter Tasarım Şablonu KurumsalJava.com

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Yedek Nasıl Alınır? "Veri Tabanı Yedekleme ve Geri Alma" butonunu tıklayınca aşağıdaki gibi bir ekran açılacaktır.

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

public static int Toplam int x, int y

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Kurulum ve Başlangıç Kılavuzu. DataPage için

ELN1001 BİLGİSAYAR PROGRAMLAMA I

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

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

A Class Terazi Kurulumu ve Kullanım Kılavuzu

API geliştiricileri. Web server ile yapılan entegrasyonun neticeleri. API Dokumantasyonu

AKINSOFT Tahsilex. Yardım Dosyası. Doküman Versiyon : Tarih : Sayfa-1. Copyright 2010 AKINSOFT

BİL BİLGİSAYAR PROGRAMLAMA (JAVA)

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Bugün Ne Oldu Bir Bilsen

Bu makalede 2003 sunucu, Windows 2003 Server anlamına gelmektedir. Aşağıda yapılan işlemler 2003 R2 sunucu üzerinde denenmiş ve çalıştırılmıştır.

The RestructuredText Book Documentation

Ders 8: Metotlar. barisgokce.com

HESAP MAKİNASI YAPIMI

UYGULA İÇİ SATIN ALMA. <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="com.android.vending.

VERİ TABANI NEDİR A. TABLO OLUŞTURMA

Veri Tabanı Yönetim Sistemleri Bölüm - 02

1. TANIMLAR 1.1 Laboratuvarım

Karma C/C + + Kodlama

U y g u l a m a A i l e s i (Abakus 360, T-Panel, T-CRM) Tarayıcı Ayarları. IPera İletişim Teknolojileri

.com. Özcan Acar 2009 Kurumsal Java.com

2. Bölüm Spring İle Tanışalım

A-Class Terazi Kurulumu ve Kullanım Kılavuzu

HUAWEI Cihazlara Erişim Yöntemleri

PHP Günleri 2013#1. mysql_* Fonksiyonları Ömrünü Doldurmak Üzere. Peki Şimdi Ne Olacak? Özgür Yazılım A.Ş.

Masa üstünde vt34.mdb dosyası var, onu projemize eklemek için, App_Data ya sağ tıkla Add Existing Item vt34.mdb adlı dosyayı seç Add

Virtualization. VMware vcenter Server Yapılandırılması

Kabuk Programlama (Bash)

NPratik Yazılım Kurulum Kılavuzu. Yedekleme İşlemi

Merhaba değerli Dostlar;

ORACLE TNS (TRANSPARENT NETWORK SUBSTRATE) LISTENER YAPILANDIRMASI

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

Üst Düzey Programlama

Hızlı Kurulum Kılavuzu

TTEC Standalone DVR Kolay Kurulum Dokümanı. Kurulum Adımları

SESSİON KULLANIMI. .Aşağıdaki Kodları da SessionDevam.asp adıyla kaydedelim. Language=VBScript Codepage="1254"%>

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

PHP, nesne-yönelimli (object-oriented) bir dil olduğu için, nesne oluşturma imkânına ve bunların kullanılmasını sağlayan metodlara da sahiptir.

1. Bilgisayarınızda kullandığınız Web tarayıcı programını (Internet Explorer, Mozilla Firefox vb.) çalıştırınız.

Mantıksal İşlemler. 7.1 true, false, nil

SHOP INGENICO DOKUMANI

İnternet Programcılığı Öğr. Gör. Serkan AKSU PHP de Dizi-Değişkenler, Nesneler. Dizi Oluşturma. Tek Boyutlu Diziler

Cost Modülü Ay sonu İşlemleri

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Hashtag ile ilgili bilmeniz gereken herşey Ne zaman hashtag yapmalıyım, nasıl hashtag oluşturmalıyım? HASHTAG KULLANIM REHBERİ

Windows 7 Format Atma ve Kurulumu (Resimli Anlatım)

Hareket Algılama. Sesli uyarı Mesaj gösterme Tam ekran yapma Alarm Çıkışı gönderme Kayıt başlatma

Uzem Öğrenci Girişi. Şekil 1

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

Transkript:

Implementing Laravel (TR) Türkçe Çevirisi Chris Fidao ve Sinan Eldem Bu kitap şu adreste satılmaktadır http://leanpub.com/implementinglaravel-tr Bu versiyon şu tarihte yayımlandı 2013-09-27 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 Chris Fidao ve Sinan Eldem

Kitabı tweetleyin! Chris Fidao ve Sinan Eldem a kitabını şu adresten Twitter tanıtarak yardımcı olun! Kitap için önerilen tweet: Implementing Laravel Türkçe Çevirisi http://leanpub.com/implementinglaravel-tr #implementinglaraveltr #laravel @laraveltr Kitap için önerilen hashtag #implementinglaraveltr. Kitap için diğerleri ne demiş merak ediyorsanız bağlantıya tıklayarak hashtagları arayabilirsiniz: https://twitter.com/search/#implementinglaraveltr

İçindekiler Ana Kavramlar......................................... 1 Konteyner............................................. 2 Temel Kullanım......................................... 2 Daha İlerisi........................................... 3 Inversion of Control (Devrik Kontrol)............................. 3 Gerçek Dünya Kullanımı.................................... 5 Bağımlılık Enjeksiyonu...................................... 7 Bağımlılık Enjeksiyonu Nedir?................................. 7 Controller Bağımlılıklarının Eklenmesi............................ 8 Bağımlılıklar Olarak Interface ler................................ 9 Neden Bağımlılık Enjeksiyonu?................................ 11 Özet............................................... 15

Ana Kavramlar Bu kitap boyunca, Laravel in en güçlü özelliklerinin bir kısmından yararlanacağız. Konuya geçmeden önce, en azından Laravel in konteynerinin ve onun Bağımlılık Enjeksiyonu kullanımını bizim için ne kadar kolaylaştırdığının bilinmesi önemlidir. Bu bölüm Laravel in konteynerini, Inversion of Control kullanımını ve Bağımlılık Enjeksiyonunu kapsayacak.

Konteyner Illuminate\Foundation\Application sınıfı bütün Laravel i birbirine bağlar. Bu sınıf bir konteynerdir - veriler, nesneler, sınıflar ve hatta closure lar içerebilir. Temel Kullanım Konteynerin nasıl çalıştığını görmek için, routes dosyamızda bir eksersiz üzerinden çalışalım. Laravel in konteyneri ArrayAccess interface ini implemente eder ve bu yüzden ona bir dizi gibi erişebileceğimizi biliyoruz. Ona ilişkisel bir dizi gibi nasıl ulaşabileceğimizi görelim. Dosya: app/routes.php 1 Route::get('/container', function() 2 { 3 // Application olgusunu elde et 4 $app = App::getFacadeRoot(); 5 6 $app['bir_dizi'] = array('foo' => 'bar'); 7 8 var_dump($app['bir_dizi']); 9 }); /container rotasına gittiğimizde, şu sonucu alacağız: 1 array (size=1) 2 'foo' => string 'bar' (length=3) Yani, Applicationun nitelikleri ve metodları olan bir sınıf olmakla birlikte, aynı zamanda bir dizi olarak ulaşılabilir olduğunu da görüyoruz! Facade lar App::getFacadeRoot() metodunun ne yaptığı kafanızı karıştırdı mı? App sınıfı bir Facade dır. Bu bize onu her yerde kullanma, ona statik bir tarzda erişme imkanı verir. Buna karşın gerçekte static bir sınıf değildir. getfacaderoot metodu sınıfın gerçek olgusunu getirecektir ki bu örnekte onu bir dizi olarak kullanabilmemiz için ihtiyacımız olan şeydir. Illuminate\Support\Facades aduzayındaki bu ve diğer Facade lara bakın.

Konteyner 3 Daha İlerisi Şimdi konteyneri biraz süsleyelim ve bir closure atayalım: Dosya: app/routes.php 1 Route::get('/container', function() 2 { 3 // Application olgusunu elde et 4 $app = App::getFacadeRoot(); 5 6 $app['selam_ver'] = function() 7 { 8 return "Merhaba, Dünya!"; 9 }; 10 11 return $app['selam_ver']; 12 }); /container rotamızı tekrar çalıştıralım ve şunu göreceğiz: 1 Merhaba, Dünya! Bu görünüşte basit olsa da gerçekte oldukça güçlüdür. Bu, aslında, ayrı Illuminate paketlerinin Laravel frameworkü oluşturmak için bir diğeriyle nasıl etkileştiğinin temelidir. İlerde, çeşitli Illuminate paketleri arasında zamk gibi etkiyen Service Providerlarının öğeleri konteynere nasıl bağladığını göreceğiz. Inversion of Control (Devrik Kontrol) Laravel in Container sınıfı sadece bir dizi kılığına bürünmekten çok daha fazlasına sahiptir. Aynı zamanda bir Inversion of Control (IoC) konteyneri olarak da işlev görebilir. Inversion of Control, bizim bir sınıf veya interface i nasıl implemente ettiğimizi tanımlamamız için bir tekniktir. Örneğin, uygulamamızın eğer bir FalanInterface bağımlılığı varsa ve biz onu implemente eden bir SomutFalan sınıfını kullanmak istiyorsak, bu implementasyonu tanımladığımız yer IoC konteyneridir. Bir kez daha /container rotamızı kullanarak, bunun nasıl çalıştığını basit bir örnekle görelim. İlk olarak, birkaç sınıf - bir interface ve onu implemente eden bir sınıf - oluşturacağız. Basit olması bakımından doğruca app/routes.php dosyasına gidebiliriz:

Konteyner 4 Dosya: app/routes.php 1 interface GreetableInterface { 2 3 public function greet(); 4 5 } 6 7 class HelloWorld implements GreetableInterface { 8 9 public function greet() 10 { 11 return 'Merhaba, Dünya!'; 12 } 13 } Şimdi, bu sınıfları kulanmak için konteynerimizle ne yapabileceğimizi görelim. Önce binding (bağlama) kavramına gireceğiz. Dosya: app/routes.php 1 Route::get('/container', function() 2 { 3 // Application olgusunu elde et 4 $app = App::getFacadeRoot(); 5 6 $app->bind('greetableinterface', function() 7 { 8 return new HelloWorld; 9 }); 10 11 $greeter = $app->make('greetableinterface'); 12 13 return $greeter->greet(); 14 }); Dizi şeklinde erişilebilir $app['greetableinterface'] kullanmak yerine bind() metodunu kullandık. Bu, Laravel in IoC konteynerinin, GreetableInterface istenen her zamanda HelloWorld sınıfının döndürülmesi amacıyla kullanılmasıdır.

Konteyner 5 Bu yolla, implementasyonları takas edebiliyoruz! Örneğin, HelloWorld yerine bir GoodbyeCruelWorld implementasyonu yapabilirim ve GreetableInterface istendiği zaman konteynerin bunu döndürmesine karar verebilirim. Bu, uygulamamızda sürdürülebilirliğe götürür. Konteyneri kullanarak, bir konumdaki implementasyonlarımızı, uygulama kodumuzun diğer alanlarını etkilemeksizin (ideal olarak) takas edebiliriz. Gerçek Dünya Kullanımı Tüm bu bağlamalarımızı uygulamanızda nereye koyacaksınız? Eğer start.php, filters.php, routes.php ve diğer bootstrap dosyalarınızı bağlamalarla doldurup karıştırmak istemiyorsanız, bu durumda Service Provider (Hizmet Sağlayıcı) sınıflarını kullanabilirsiniz. Service Providerları özel olarak Laravel in konteynerine bağlamaları kayda geçirmek için oluşturulurlar. Aslında, neredeyse tüm Illuminate paketleri sadece bu işi yapan bir Service Provider kullanmaktadır. Hizmet Sağlayıcılarının bir Illuminate paketi içinde nasıl kullanıldığının bir örneğini görelim. Pagination paketini inceleyeceğiz. Öncelikle, Pagination Service Provider in register() metodu şöyledir: Illuminate\Pagination\PaginationServiceProvider.php 1 public function register() 2 { 3 $this->app['paginator'] = $this->app->share(function($app) 4 { 5 $paginator = new Environment( 6 $app['request'], 7 $app['view'], 8 $app['translator'] 9 ); 10 11 $paginator->setviewname( 12 $app['config']['view.pagination'] 13 ); 14 15 return $paginator; 16 }); 17 } Bu register() metodu app/config/app.php dosyası içinde belirtilen her Service Provider ı üzerinde otomatik olarak çağrılmaktadır.

Konteyner 6 Pekiyi, bu register() metodunda neler yapılıyor? Birincisi ve en önemlisi, paginator olgusunu konteynere kayda geçiriyor. Bu, uygulamanın her yerinde $app['paginator'] ve App::make('paginator') kulllanılabilmesini sağlıyor. Daha sonra, tıpkı selam_ver örneğinde yaptığımız gibi, bir closure un sonucu olarak döndürülmek üzere paginator olgusunu tanımlıyor. $this->app->share() kullanılması kafanızı karıştırmasın. Share metodu sadece closure un bir singleton olarak kullanılması için bir yol sağlar, $this->app->instance('paginator', new Environment) çağırmak gibi bir şeydir. Bu closure yeni bir Pagination\Environment nesnesi oluşturuyor, onun üzerinde bir yapılandırma değeri ayarlıyor ve onu döndürüyor. Bu Hizmet Sağlayıcının diğer uygulama bağlamalarını kullandığı dikkatinizi çekmiş olmalı! Pagination\Environmen sınıfı, oluşturucu metodunda açıkça bazı bağımlılıklar alıyor - bir request nesnesi $app['request'], bir view nesnesi $app['view'] ve bir translator $app['translator']. Neyse ki, bu bağlamalar Illuminate in diğer paketlerinde oluşturulmuş olan çeşitli Service Providerlarda tanımlanmışlardır. Çeşitli Illuminate paketlerinin birbirleriyle nasıl etkileşebildiğini de görebiliyoruz. Onlar uygulama konteynerine bağlanmış oldukları için, diğer paketlerde (veya kendi kodumuz içinde!) onları kullanabiliyoruz ve bizim kodumuzu spesifik bir sınıfa gerçekten bağlamamamız gerekmiyor.

Bağımlılık Enjeksiyonu Konteynerin nasıl çalıştığını gördüğümüze göre, Laravel de Bağımlılık Enjeksiyonunu uygulamak için onu nasıl kullanabileceğimize bakabiliriz. Bağımlılık Enjeksiyonu Nedir? Bağımlılık Enjeksiyonu bir sınıf bağımlılığını sınıf kodunun kendisi içindeki bir yerlerde başlatmak yerine, sınıf içine eklenmesi (enjekte edilmesi) eylemidir. Sıklıkla, bağımlılıklar bir oluşturucu metodun type-hinted (tip dayatmalı) parametreleri olarak tanımlanırlar. Örneğin şu oluşturucu metodu ele alalım: 1 public function construct(helloworld $greeter) 2 { 3 $this->greeter = $greeter; 4 } Bir parametre olarak HelloWorld tip dayatması yapmakla, bir HelloWorld olgusunun sınıfımızın bir bağımlılığı olduğunu açıkça ifade ediyoruz. Bu, direkt olgu başlatmanın karşıtıdır: 1 public function construct() 2 { 3 $this->greeter = new HelloWorld; 4 } Kendi kendinize neden Bağımlılık Enjeksiyonu kullanılıyor diye soruyorsanız, bu Stack Overflow cevabı¹ başlamak için harika bir yerdir. Aşağıdaki örneklerde onun bazı yararlarını anlatacağım. Sonra da Laravel in IoC konteynerini kullanan Bağımlılık Enjeksiyonu örneğini iş başında göreceğiz. ¹http://stackoverflow.com/questions/130794/what-is-dependency-injection

Bağımlılık Enjeksiyonu 8 Controller Bağımlılıklarının Eklenmesi Bu Laravelde çok sık kullanılan bir durumdur. Normalde, bir controlleri oluşturucu metodunda bir sınıf bekleyecek şekilde ayarlarsak, bu sınıf oluşturulurken bağımlılıklarını da eklememiz gerekir. Ancak, bir Laravel controllerinde bir bağımlılık tanımladığımızda ne olur? Controlleri kendimiz başka bir yerde başlatmamız gerekecektir: 1 $crtl = new ContainerController( new HelloWorld ); Bu harika, ancak Laravel de bir controlleri direkt olarak başlatmayız - bunu bizim için router halleder. Bununla birlikte, biz yine de Laravel in IoC konteynerini kullanmak suretiyle controller bağımlılıklarını enjekte edebiliriz! Daha önce kullandığımız aynı GreetableInterface ve HelloWorld sınıflarını kullanarak, şimdi /container rotamızı bir controllere bağlamayı düşünelim: Dosya: app/routes.php 1 interface GreetableInterface { 2 3 public function greet(); 4 5 } 6 7 class HelloWorld implements GreetableInterface { 8 9 public function greet() 10 { 11 return 'Merhaba, Dünya!'; 12 } 13 } 14 15 Route::get('/container', 'ContainerController@container); Şimdi de yeni controllerimizde, oluşturucu metodunda bir parametre olarak HelloWorld ayarlayabiliriz:

Bağımlılık Enjeksiyonu 9 Dosya: app/controllers/containercontroller.php 1 <?php 2 3 class ContainerController extends BaseController { 4 5 protected $greeter; 6 7 // Sınıf bağımlılığı: HelloWorld 8 public function construct(helloworld $greeter) 9 { 10 $this->greeter = $greeter; 11 } 12 13 public function container() 14 { 15 return $this->greeter->greet(); 16 } 17 18 } Şimdi /container rotanıza gidin ve yine şunu göreceksiniz: 1 Merhaba, Dünya! Ancak, dikkat ediniz, konteynere hiçbir şey BAĞLAMADIK. O sadece, controllere geçmiş olduğumuz HelloWorldun bir olgusunu çalıştırdı! Bunun nedeni IoC konteynerinin bir controllerin oluşturucu metodunda ayarlanan herhangi bir bağımlılığı otomatik olarak çözümlemeye çalışmasıdır. Laravel belirtilen bağımlılığı bizim için enjekte edecektir! Bağımlılıklar Olarak Interface ler Daha bitirmedik ama. Ne yapacağımızı şimdi görün! Bir controller in bağımlılığı olarak HelloWorld sınıfını belirtmek yerine GreetableInterface interface ini belirtsek ne olacaktı? Controller kodunu şöyle yapsak:

Bağımlılık Enjeksiyonu 10 Dosya: app/controllers/containercontroller.php 1 <?php 2 3 class ContainerController extends BaseController { 4 5 protected $greeter; 6 7 // Sınıf bağımlılığı: GreetableInterface 8 public function construct(greetableinterface $greeter) 9 { 10 $this->greeter = $greeter; 11 } 12 13 public function container() 14 { 15 echo $this->greeter->greet(); 16 } 17 18 } Bunu olduğu gibi çalıştırmayı denersek bir hata alırız: 1 Illuminate\Container\BindingResolutionException: 2 Target [GreetableInterface] is not instantiable (Hedef [GreetableInterface] başla\ 3 tılamadı) GreetableInterface sınıfı tabii ki başlatılamaz çünkü o bir interface dir. Bununla birlikte, Laravel in sınıf bağımlılığını çözmek için onu başlatma çabasına girdiğini görebiliyoruz. Bunu düzeltelim - controller imiz bir GreetableInterface olgusuna bağımlı olduğunu hissettiği zaman Laravel in controller e HelloWorld olgusu vermesi için konteynerin bind() metodunu kullanacağız:

Bağımlılık Enjeksiyonu 11 Dosya: app/routes.php 1 interface GreetableInterface { 2 3 public function greet(); 4 5 } 6 7 class HelloWorld implements GreetableInterface { 8 9 public function greet() 10 { 11 return 'Merhaba, Dünya!'; 12 } 13 } 14 15 // GreetableInterface istendiğinde 16 // HelloWorld bağlamasını burada yapıyoruz!! 17 App::bind('GreetableInterface', 'HelloWorld'); 18 19 Route::get('/container', 'ContainerController@container); Şimdi /container rotanızı tekrar çalıştırırsanız, aynı şekilde yine Merhaba, Dünya! göreceksiniz! Dikkat ediniz, HelloWorld bağlamak için bir closure kullanmadık - İstediğiniz bir somut sınıfı basitçe bir string şeklinde geçebiliyorsunuz. Implentasyonunuzun kendi oluşturucu metoduna geçilmesi gereken kendi bağımlılıkları olduğu takdirde bir closure yararlı olacaktır. Neden Bağımlılık Enjeksiyonu? Bir bağımlılık olarak somut bir sınıf yerine neden bir interface belirtmek istiyoruz ki? Oluşturucuya verilen bir sınıf bağımlılığının bir interface in bir alt sınıfı olabilmesi için bunu istiyoruz. Bu sayede, - ihtiyacımız olan metod her zaman mevcut olacak - herhangi bir implementasyonu güvenle kullanabiliyoruz. Özlü bir ifadeyle, uygulama kodumuzun diğer kısımlarını etkilemeksizin ilgili implementasyonu değiştirebiliriz. İşte bir örnek. Gerçek uygulamalarda birçok kez yapmak zorunda kaldığım bir şey.

Bağımlılık Enjeksiyonu 12 Bu örneği kopyala yapıştır yapmayın. Konuyu temiz tutmak amacıyla, API keyleri için yapılandırma değişkenleri kullanımı gibi bazı detayları atladım çünkü. Diyelim ki, uygulamamız Amazon un AWS sini kullanarak emailler gönderiyor. Bunu gerçekleştirmek için, bir Emailer interface ve bunu implemente eden bir AwsEmailer sınıfı tanımladık: 1 interface Emailer { 2 3 public function send($to, $from, $subject, $message); 4 } 5 6 class AwsEmailer implements Emailer { 7 8 protected $aws; 9 10 public function construct(awssdk $aws) 11 { 12 $this->aws = $aws; 13 } 14 15 public function send($to, $from, $subject, $message) 16 { 17 $this->aws->addto($to) 18 ->setfrom($from) 19 ->setsubject($subject) 20 ->setmessage($message); 21 ->sendemail(); 22 } 23 } Emailere AwsEmailer implementasyonunu bağlıyoruz: 1 App::bind('Emailer', function() 2 { 3 return new AwsEmailer( new AwsSDK ); 4 }); Bir controller bağımlılık olarak Emailer interface ini kullanıyor:

Bağımlılık Enjeksiyonu 13 Dosya: app/controllers/emailcontroller.php 1 class EmailController extends BaseController { 2 3 protected $emailer; 4 5 // Sınıf bağımlılığı: Emailer 6 public function construct(emailer $emailer) 7 { 8 $this->emailer = $emailer; 9 } 10 11 public function email() 12 { 13 $this->emailer->send( 14 'ex-to@example.com', 15 'ex-from@example.com', 16 'Peanut Butter Jelly Time!', 17 "It's that time again! And so on!" 18 ); 19 20 return Redirect::to('/'); 21 } 22 23 } Bir süre geçtikten sonra uygulamamızın kapsamı büyüdü ve AWS nin sağladığından daha fonksiyonel bir şeye ihtiyaç doğdu. Biraz araştırdıktan ve seçenekleri değerlendirdikten sonra SendGrid üzerinde karar kıldık. Uygulamamızı SendGrid kullanacak şekilde değiştirmek için neler yapmamız gerekiyor? Interface ler ve Laravel in IoC konteynerini kullandığımız için, SendGrid e geçiş çok kolaydır! İlk olarak, Emailer interface inin SendGrid kullanan bir implementasyonunu yapacağız!

Bağımlılık Enjeksiyonu 14 1 class SendGridEmailer implements Emailer { 2 3 protected $sendgrid; 4 5 public function construct(sendgridsdk $sendgrid) 6 { 7 $this->sendgrid = $sendgrid; 8 } 9 10 public function send($to, $from, $subject, $message) 11 { 12 $mail = $this->sendgrid->mail->instance(); 13 14 $mail->addto($to) 15 ->setfrom($from) 16 ->setsubject($subject) 17 ->settext( strip_tags($message) ) 18 ->sethtml($message) 19 ->send(); 20 21 $this->sendgrid->web->send($mail); 22 } 23 } Sonra da, (ve son olarak!), uygulamamızı Aws yerine SendGrid kullanacak şekilde ayarlayacağız. IoC konteynerinde bind() metoduna bir çağrımız olması nedeniyle, yapacağımız tek değişiklik Emailerin implementasyonunu AwsEmailerden SendGridEmailere değiştirmektir: 1 // Eskisi 2 App::bind('Emailer', function() 3 { 4 return new AwsEmailer( new AwsSDK ); 5 }); 6 7 // Yenisi 8 App::bind('Emailer', function() 9 { 10 return new SendGridEmailer( new SendGridSDK ); 11 }); Dikkat ederseniz tüm bunları, uygulamamızın başka yerlerindeki kodun tek bir satırını değiştirmeksizin yaptık. Bir bağımlılık olarak Emailer interface kullanımına zorlamakla, enjekte edilecek bir sınıfta send() metodunun mevcut olması garanti altına alınmış oluyor.

Bağımlılık Enjeksiyonu 15 Örneğimizde bunu görebiliyoruz. Implementasyonu AwsEmailerden SendGridEmailere değiştirdiğimiz zaman, controller bir değişiklik yapılmasına gerek kalmadan hala $this->emailer->send() metodunu çağırmaktadır. Özet Bağımlılık Enjeksiyonu ve Inversion of Control, Laravel geliştirmede tekrar tekrar kullanılan desenlerdir. Gördüğünüz gibi, kodumuzu daha sürdürülebilir yapmak ve test edilebilirliğe yardımcı olması için birçok interface tanımlayacağız. Laravel in IoC konteyneri bizim için bunu kolay bir hale getirmektedir.