LARAVEL 5.7 : Depedency Injection pada Laravel

December 04, 2018 by



Dependency Injection (DI) adalah sebuah design pattern yang memungkinkan kita untuk menulis kode yang lebih baik, dimana DI menitikberatkan pada penulisan kode yang loosely coupled, highly modular dimana ketergantungan antar class tidaklah tinggi, sehingga kita dapat mengubah sebuah class tanpa diliputi rasa khawatir class tersebut membuat break class-class lain yang bergantung pada class yang kita rubah tadi.

Dependency Injection sendiri bukanlah sebuah design pattern yang baru, melainkan sudah banyak digunakan dalam bahasa pemrograman seperti Java. Namun di dunia PHP sendiri, DI menjadi populer karena digunakan di framework-framework PHP yang populer seperti Laravel dan Symfony.

Nah, sebenarnya apakah Dependency Injection itu ?

Berikut adalah definisi Dependency Injection yang ditulis di wikipedia :
In software engineering, dependency injection is a technique whereby one object supplies the dependencies of another object. A dependency is an object that can be used (a service). An injection is the passing of a dependency to a dependent object (a client) that would use it. The service is made part of the client’s state.[1]Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern.

Jika definisi di atas masih terasa membingungkan, tidak perlu khawatir karena kita akan membahasnya dalam pembahasan yang lebih practical. Mari kita sederhanakan definisi di atas menjadi
Dependency Injection adalah proses memasukkan (inject)sebuah class ke dalam class lain.

Ada alasan tertentu mengapa saya menggunakan istilah memasukkan / inject bukan memanggil / call. Karena implementasi dari inject dan call akan sangat berbeda. 

Kalau class yang depend hanya 2 seperti contoh diatas tentu tidak akan menjadi masalah. tapi bagaimana kalau ada 100 class ?

Kejadian seperti ini sering terjadi di dunia nyata. Seperti implementasi mail server atau database engine. Awalnya kita menggunakan MySQL sebagai database engine pada aplikasi kita. Ternyata ditengah jalan, kita mengganti database engine dari MySQL ke Oracle misalnya. Padahal class MySQL sudah terlanjur direferensikan oleh 100 atau lebih file. Tentu saja hal ini akan memusingkan si developer. Sebagai catatan, ini sangat mungkin terjadi jika kita koding menggunakan PHP Native atau framework dengan struktur yang arbitrary seperti flask-nya Python atau express-nya NodeJs. Namun untuk framework dengan struktur yang jelas seperti Laravel hal ini sudah di handle out-of-the-box.

Selanjutnya kita akan coba me-refactor kode menggunakan Dependency Injection. Pertama, kita akan membuat sebuah interface bernama file.php untuk memastikan filekedua.php dan fileketiga.php memiliki fungsi yang ada pada interface file.php.

private $file;

public function __construct(File $file)
{
      $this->file= $file;
}

Perhatikan metode __construct pada masing-masing class di atas. Terlihat ada parameter berupa class File yang di-injeksi-kan pada metode tersebut. Inilah yang disebut dengan Dependency Injection, dimana kita memasukkan sebuah class ke dalam constructor atau method class lainnya.
Sedikit tambahan, Dependency Injection tidak hanya terbatas pada constructorsaja melainkan bisa juga di-inject langsung ke method yang dimiliki oleh class tersebut.

public function fillUp(Fuel $fuel)
{
    $string = "This motorcycle is filled up with {$fuel->getName()}";
    $string .= " with octane {$fuel->getOctane()}";
    $string .= " and you have to pay Rp {$fuel->getPrice()}\n";

    echo $string;
}

contoh lainnya yang sering kita temui
use App\Http\Request;
...
public function get(Request $request)
{
$input = $request->all()
...
}

0 comments:

Post a Comment