Laravel Service Container #1 (Introduction & Basic Binding)

multinity

Hi! Akhirnya bisa bikin artikel lagi setelah sibuk akhir-akhir ini :D,, & Kali ini agak berbeda saya gak bahas Cross-Platform-Software lagi seperti artikel-artikel saya yang sebelum-sebelumnya tapi lebih spesifik lagi ke PHP.

Ok, Kali ini saya akan membahas fitur yang sangat keren banget dari Framework Laravel yaitu Laravel Service Container!, Sebelumnya, Di Laravel 4.* fitur ini bernama IoC (Inversion of Control) Container, tapi pada dasarnya sama saja di versi Laravel berapapun.

Biar gak terlalu bingung, mari simak penjelasanya dari official documentation Laravel yaitu :

The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection. Dependency injection is a fancy phrase that essentially means this: class dependencies are “injected” into the class via the constructor or, in some cases, “setter” methods.

Sebelum melanjutkan ke pembahasan, Saya asumsikan pembaca sudah paham minimal mengerti PHP Namespace, Interface, Class, Closure, dll.

Silahkan liat contoh kode dibawah ini :

<?php 

namespace App\Kodinger; 


class Smartphone {

    protected $baterai;

    public function __construct(Baterai $baterai) {
        $this->baterai = $baterai;
    }

    public function cekBateraiPercent() {
        return $this->baterai->percentage();
    }

}
<?php 

namespace App\Kodinger;

class Baterai {

    protected $lifetime = 1000;

    protected $percentage = 20;

    public function health() {
        return ($this->lifetime >= 2000)
            ? 'replace soon!'
            : 'healthy!';
    }

    public function percentage() {
        return $this->percentage . '%';
    }



}

Karena sekarang jaman now, saya akan mencontohkanya dengan sebuah Smartphone, Dalam kasus ini Smartphone saya ibaratkan kedalam sebuah class, dimana smartphone mempunyai baterai yang juga saya ibaratkan kedalam sebuah class Baterai, Jika tanpa Service Container untuk mengetahui baterai sebuah smartphone nya akan seperti dibawah ini

 

Nah, pada screenshot di atas, pertama saya menginisialisasi class Baterai kedalam variable $baterai sehingga saat kita membutuhkan class Baterai kita tinggal menggunakan variable $baterai  saja, tapi kenapa saya menginisialisasi class Baterai terlebih dahulu? Padahal saya mau menggunakan class Smartphone ???

Yap, Itu karena class Smartphone membutuhkan instance dari class Baterai pada constructor nya, sehingga saat kita ingin menggunakan class Smartphone kita harus mengirim instance dari class Baterai ke dalam parameter class Smartphone. Make sense?

Nah, masalahnya adalah bagaimana jika class Smartphone membutuhkan banyak class?? Seperti misalnya Smartphone akan bisa digunakan untuk telfon, sms, game, dll. Yang berarti kita harus menginisialisasi setiap class, memasukanya ke variable, lalu mengirimnya ke class Smartphone? oh tentu sangat ribet & Bad Practice / Not Efficient. 

Sebuah kebodohan yang hqq, ia rela menginisialisasi berbagai macam class hanya untuk menampilkan baterai percentage saja.

 

Maka disinilah Laravel Service Container hadir sebagai solusi, Dengan fitur Automatic Dependency Resolution yang secara otomatis akan mengirim paramater-parameter yang dibutuhkan class Smartphone itu sendiri! Laravel Service Container sendiri menggunakan PHP ReflectionClass untuk dapat me-resolve dependency yang dibutuhkan secara otomatis.

Nah, setelah tau apa itu Laravel Service Container, lalu, Bagaimana cara menggunakanya???, Itu yang pasti akan terlintas di pikiran kalian saat ini? benar?

Laravel Service Container mempunyain beberapa istilah yaitu Binding Resolve, Binding merupakan proses men-assign sebuah value (bisa berupa, string, object, array, boolean, bahkan closure sekalipun) kedalam sebuah key, seperti associative array saja deh. Dan Resolce merupakan proses mengambil data berdasarkan key yang sudah kita bind tadi. Let’s check it out!

Service Container instance dapat kalian akses menggunakan global helper app()atau menggunakan Facade Illuminate\Support\Facades\App.

Untuk melakukan proses binding, kalian bisa membuatnya di method register() pada Service Provider, dengan code dibawah ini :

public function register()
{
   $this->app->bind('key', 'value');
}

Atau jika kalian menggunakan global helper kalian bisa melakukan binding degan code dibawah ini :

app()->bind('key', 'value');

Nah, jika sudah di binding, maka selanjutnya untuk check baterai percentage dari smartphone kita hanya tinggal melakukanya seperti dibawah ini, tanpa inisialisasi class, tanpa memasukanya ke dalam variable dll.

Easy isn’t it! Tapi mungkin beberapa dari kalian belum paham karena penjelasan saya yang berantakan ini.

Mungkin hanya basic binding saja yang akan saya bahas pada part kali ini, untuk resolving dan advancing Service Container akan saya bahas di part-part berikutnya! See ya!

 

Final code bisa kamu lihat di https://github.com/itskodinger/laravel-service-container/

Digital Ocean baner

Share