Setup Menus in Admin Panel

Laravel Service Container #2 (Basic Resolving & Interface Binding)

Di part sebelumnya yaitu Laravel Service Container #1 (Introduction & Basic Binding) kita sudah mempelajari basic dari Service Container & Basic Binding, Dimana kita sudah berhasil Menggunakan class Smartphone tanpa harus passing dependency yang dibutuhkan class Smartphone itu sendiri.

Di part sebelumnya saya belum membahas maksud dari code app('App\Kodinger\Smartphone') yang bisa menghasilkan sebuah instance dari class Smartphone.

 

Itu lah yang disebut dengan resolve yaitu proses mengambil data berdasarkan key yang sudah kita bind sebelumnya!

Nah, Proses resolve itu sendiri bisa dilakukan dengan berbagai cara, yaitu dengan app('key'), app()->make('key') atau app()['key'].

Hasilnya akan sama saja! Oke! sudah paham binding & resolving kan? Oke kite lanjut ke step selanjutnya!

Interface Binding

Dalam membuat aplikasi PHP kita mungkin akan menggunakan interface sebagai blueprint atau kerangka sebuah class. Misalnya saja sebuah smartphone dapat memiliki sim card lebih dari 1 / multi sim, maka kita akan membangun sebuah interface seperti dibawah ini.

<?php 

namespace App\Kodinger\Sim;

interface Sim {

    /**
     * Cek pulsa dari sim yang digunakan.
     * 
     * @return string
     */
    public function cekPulsa();

    /**
     * Cek kuota dari sim card yang digunakan.
     * 
     * @return string
     */
    public function cekKuota();

}

Interface tersebut memiliki 2 kerangka method yaitu cekPulsa() dan cekKuota() . Lalu Sim card 1 membuat implementasinya sebagai berikut.

<?php 

namespace App\Kodinger\Sim;

class Sim1 implements Sim {

    /**
     * Cek pulsa dari sim yang digunakan.
     * 
     * @return string
     */
    public function cekPulsa() {
        return 'Sisa pulsa anda adalah 100.000.';
    }

    /**
     * Cek kuota dari sim card yang digunakan.
     * 
     * @return string
     */
    public function cekKuota() {
        return 'Sisa kuota paket regular anda adalah 456TB';
    }

}

dan Sim 2 memiliki implementasi sebagai berikut.

<?php 

namespace App\Kodinger\Sim;

class Sim2 implements Sim {

    /**
     * Cek pulsa dari sim yang digunakan.
     * 
     * @return string
     */
    public function cekPulsa() {
        return 'Sisa pulsa anda kurang dari 20juta';
    }

    /**
     * Cek kuota dari sim card yang digunakan.
     * 
     * @return string
     */
    public function cekKuota() {
        return 'Sisa kuota paket flash local anda adalah -200GB';
    }

}

Selanjutnya, Kita pasang sim card tersebut ke smartphone kita!

<?php 

namespace App\Kodinger; 

use App\Kodinger\Sim\Sim;

class Smartphone {

    protected $baterai;

    protected $simCard;

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

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

    public function kuota() {
        return $this->simCard->cekKuota();
    }

    public function pulsa() {
        return $this->simCard->cekPulsa();
    }

}

Nah, Tanpa Service Container kita akan melakukanya seperti dibawah ini :

Meh.. Terlalu ribet & tidak efisien kan? Lalu bagaimana caranya mengimplementasikanya dengan Service Container? Hmm… apakah kita tinggal menggunakan app('App\Kodinger\Smartphone') seperti sebelumnya? Mari kita check!

Oops! sepertinya tidak bisa, kenapa? Karena kita passing Sim card sebagai interface, bukan implementasinya, lalu bagaimana cara agar kita bisa mengirim implementasinya bukanya interfacenya? Simple! Yaitu dengan interface binding!

$this->app->bind(
  'App\Kodinger\Sim\Sim',
  'App\Kodinger\Sim\Sim1'
);

Sama saja seperti binding basic, tetapi pada parameter pertama (atau key nya) kita menggunakan full namespace dari interface yang akan kita implementasikan, misalnya pada kasus sim card kali ini namespace interface nya adalah App\Kodinger\Sim\Sim dan implementasi yang akan digunakan adalah Sim1 yang berada di namespace App\Kodinger\Sim\Sim1. Jadi sekarang $simCard adalah instance dari Sim1!

Jika ingin switch sim ke sim 2 tinggal ubah saja binding nya sperti dibawah ini :

$this->app->bind(
  'App\Kodinger\Sim\Sim',
  'App\Kodinger\Sim\Sim2'
);

Maka sekarang $simCard adalah instance dari Sim 2!

Nah! Sudah paham? Tapi ada juga kasus dimana kita akan menggunakan sim card bergantian, kalo harus merubah binding di service provider tentunya susah dong, sedangkan Service Provider di boot saat Runtime, jadinya gimana buat switch sim secara dinamis? Akan saya bahas di artikel lainya dalam Laravel Service Container & Registry Pattern!.

 

Nah sekian untuk part #2 kali ini, Saya akan melanjutkan Part selanjutnya yang membahas Contextual Binding & Container events! See ya!!

 

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

Digital Ocean baner

February 19, 2018
Copyright © Kodinger 2018. Powered by Multinity

X