LARAVEL 5.7 : Inversion of Control (IoC)

December 04, 2018 by

Apa itu IoC Container ?

The Laravel inversion of control container is a powerful tool for managing class dependencies. Dependency injection is a method of removing hard-coded class dependencies. Instead, the dependencies are injected at run-time, allowing for greater flexibility as dependency implementations may be swapped easily.

Oke, itu penjelasannya. Udah ngerti kan? :D

Jadi gini, IoC (Inversion of Control) itu fitur di Laravel yang memudahkan kita untuk menggunakan class yang ada di dalam framework atau class yang kita buat tanpa harus menggunakan syntax include dan new setiap kali kita membutuhkan class tersebut. Manfaat lainnya adalah memudahkan kita untuk melakukan testing dan memudahkan pengembangan aplikasi. Itu hanya sebagian kecilnya (yang saya ngerti), tentunya masih banyak yang lain.

Ada dua istilah penting di IoC Container, yaitu closure, bind, dan resolveClosure adalah object (bisa berupa class atau fungsi) yang kita masukkan ke dalam container. Bind adalah proses mengikat closure ke dalam container dengan keyword tertentu. Dan terakhir, Resolve adalah proses memanggil closure tersebut dengan keyword yang kita tentukan sebelumnya.

Berikut ini cara melakukan binding :
App::bind(‘keyword’, ‘closure’);

Kalau mau binding ke class, sintaxnya jadi begini :
App::bind(‘keyword’, function()
{
    return new nama_class();
});


Kalau mau binding ke fungsi, jadi begini :
App::bind(‘keyword, function()
{
echo ‘Aku Lele!’;
});


Sedangkan ini cara melakukan resolve :
App::make(‘keyword’);


Bisa juga hasil dari resolve itu diarahin ke variabel lain :
$variable = App::make(‘keyword’);

Contoh penggunaan.

Biar lebih paham, silahkan bikin project laravel baru. 
Kemudian isi sintax ini di bagian paling bawah app/routes.php

File: app/routes.phpApp::bind(‘ikan’, function()
{
echo ‘Aku ikan Lele!’;
});
Route::get('/mancing', function()
{
return App::make('ikan');
});


Sekarang coba jalankan aplikasinya, kemudian akses sub-url /mancing
Akan keluar tulisan: Aku ikan Lele!


Yang terjadi pada sintax ini adalah ketika user mengakses url /mancing maka akan diarahkan ke fungsi yang memanggil tipe (keyword) yang disimpan dengan nama ikan. Dan tipe ikan ini telah diregister untuk sebuah closure dengan isian sebuah fungsi yang menampilkan tulisan Aku ikan Lele!.

Contoh kedua, mari kita bind sebuah class pada IoC Container. Tuliskan syntax berikut ini di baris paling bawah app/routes.php.

File: app/routes.php

class Mobil {
    public function jenis()
   {
        return "Aku mengendarai mobil!";
    }
}

App::bind('kendaraan', function()
{
    return new Mobil();
});

Route::get('mengendarai', function()
{
     $kendaraan = App::make('kendaraan');
     echo $kendaraan->jenis();
});


Ketika kita mengakses url /mengendarai maka akan keluar output Saya mengendarai mobil!. Hal ini karena keyword kendaraan sudah kita bind dengan class Mobil. Terlihat disini, kita tidak menggunakan keyword newuntuk membuat class tersebut. Lebih jauh lagi, dengan binding ini, kita bisa mengakses App::make(‘kendaraan’) dari controller kita (bahkan dari berbagai lokasi di aplikasi kita) dan tetap memperoleh hasil yang sama.

Untuk mencobanya, tambahkan kode berikut setelah fungsi terakhir di app/controllers/HomeController.php

File: app/controllers/HomeController.php

public function showKendaraan() {
     $kendaraan = App::make(‘kendaraan’);
     echo $kendaraan->jenis();
}

Dan, ubah isian Route::get(‘mengendarai’, … ) pada app/routes.php menjadi seperti berikut:

File: app/routes.php
Route::get('mengendarai', 'HomeController@showKendaraan');


Coba akses kembali url /mengendarai dan kita tetap memperoleh hasil yang sama! Kalau diperhatikan di file controller kita tidak pernah meng-includeclass tersebut kan? Keren! :D

Sekian penjelasan singkat saya tentang IoC Container di Laravel. Sebenarnya masih banyak fitur IoC Container yang belum saya jelaskan, seperti fitur singleton, shared dan penggunaan IoC Container untuk testing. Mudah-mudahan kedepannya bisa dijelasin.

Selanjutnya, saya berencana akan menulis tulisan tentang Dependency Injection dan Facade di Laravel. Kalau rekan-rekan ada mau request artikel tulis di komen ya, siapa tahu saya bisa ngejelasin. Hehehe.. :D

Terakhir, jangan lupa gelas kopinya di cuci, kasihan istri..
Dahhhh!!! :D

0 comments:

Post a Comment