Setup Menus in Admin Panel

Laravel Service Container & The Registry Pattern!

Meneruskan artikel sebelumnya tentang Service Container di Laravel Service Container #2 (Basic Resolving & Interface Binding) kita tidak bisa secara dinamis mengganti sim card yang ingin kita gunakan, karena proses assign sim card terjadi pada saat Service Provider di boot, Tapi apakah kita tidak bisa mengakalinya? Tentu saja bisa!,  Let’s hack into it!

Pertama kita membutuhkan Registry Class untuk me-register sim card di SmartPhone kita!

<?php 

namespace App\Services\Registry;

use App\Services\Contracts\Sim;

class SimCardRegistry {

    /**
     * Sim Card Prefix Registry.
     * 
     * @var array
     */
    public $simCards = [];

    /**
     * Register New SimCard
     * 
     * @return void
     */
    public function register($prefix, Sim $sim) {
        $this->simCards[$prefix] = $sim;
    }

    /**
     * Retrieve the SimCard Object.
     * 
     * @return Sim
     */
    public function get($prefix) {
        if(array_key_exists($prefix, $this->simCards)) {
            return $this->simCards[$prefix];
        }

        throw new \Exception("Unregistered Sim Card");
    
    }

}

Setelah kita membuat registry, selanjutnya kita register di Service Provider

<?php

namespace App\Providers;

use App\Services\Registry\SimCardRegistry;
use Illuminate\Support\ServiceProvider;
use App\Services\Sim\Sim1;
use App\Services\Sim\Sim2;

class SimServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        $this->app->make(SimCardRegistry::class)->register('sim1', new Sim1());
        $this->app->make(SimCardRegistry::class)->register('sim2', new Sim2());

    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(SimCardRegistry::class);
        $this->app->bind('simRegistry', SimCardRegistry::class);
    }
}

Setelah itu kita register Service Provider yang baru saja kita buat ke config/app.php

"providers" => [
    ......
    App\Providers\SimServiceProvider::class,
]

Beres!

Sebelum lanjut ke tahap selanjutnya, mari kita cari tau, apa yang code-code diatas perbuat, sampai-sampai kita bisa secara dinamis menggunakan Registry.

Jadi, saat aplikasi Laravel kalian dibuka, Laravel akan Booting Service provider yang dibutuhkan, seperti Route yang menggunakan RouteServiceProvider, dll. Nah, saat  SimServiceProvider di boot dia akan me-register sim card yang kita define ke SimCardRegistry

/**
 * Bootstrap services.
 *
 * @return void
 */
public function boot()
{
    $this->app->make(SimCardRegistry::class)->register('sim1', new Sim1());
    $this->app->make(SimCardRegistry::class)->register('sim2', new Sim2());

}

Nah, di SimCardRegistry pada method register() dia akan menerima parameter pertama sebagai prefix, dan parameter kedua sebagai Sim instance yang akan di assign atau di pasangkan ke prefix di parameter pertama, menjadi sebuah associative array.

Jadi saat kita melakukan register, yang terjadi di belekang layar adalah, SimCardRegistry akan menambah array ke property $simCards sesuai prefixnya,

/**
* Register New SimCard
* 
* @return void
*/
public function register($prefix, Sim $sim) {
    $this->simCards[$prefix] = $sim;
}

Nah jadi, sekarang instance nya bisa di akses dengan $this->simCards[$prefix] yang akan menghasilkan instance dari Sim Card. Jika kalian dump property $simCards maka resultnya adalah sebuah associative array.

Untuk mengecek nya, kita bisa langsung mengambil data dari property $simCards

Kode diatas berfungsi dengan baik, tapi terlihat sedikit berantakan dan tidak enak di pandang, maka dari itu SimCardRegistry menyediakan getter!

Lebih enak & terlihat profesional kan? ;), Mari kita lanjut ke step selanjutnya!

See? Sekarang kita bisa menggunakan Sim1 dan Sim2 secara bersamaan! Kenapa? Mari kita lihat class smartphone kita yang baru!

<?php 

namespace App;

use App;
use App\Services\Registry\SimCardRegistry;

class Smartphone {

    protected $simRegistry;

    public function __construct() {
        $this->simRegistry = App::make(SimCardRegistry::class);
    }

    public function kuota($sim) {
        try {
            $simCard = $this->simRegistry->get($sim);
        } catch(\Exception $e) {
            return;
        }

        return $simCard->cekKuota();
    }

    public function pulsa($sim) {
        try {
            $simCard = $this->simRegistry->get($sim);
        } catch (\Exception $e) {
            return;
        }

        return $simCard->cekPulsa();

    }

}

Pada class Smartphone kita membuat 2 method, yaitu pulsa() & kuota(), dimana masing2 method menerima parameter $sim yang menandakan sim mana yang ingin dipakai, pada kasus kali ini sim yang bisa di pakai adalah sim1 & sim2 karena sim tersebut yang sudah kita register di SimServiceProvider, apakah kita bisa menambah Sim Card baru? Tentu saja! Tinggal register Sim Baru kita ke methodboot() di SimServiceProvider!

$this->app->make(SimCardRegistry::class)->register('sim3', new Sim3());

Nah! Seperti itu lah kira-kira konsep Registry Pattern!

Mungkin dari kalian ada yang berfikir, code yang kita tulis diatas terlihat seperti useless atau tidak berguna di real project, Tapi setelah tau kegunaanya, Kita akan terbantu sekali dengan metode Registry Pattern ini, Mungkin nanti akan saya buat Artikel penggunaan Service Container, Registry Patter dll di real world project, See ya!

 

Referensi :

Final code dari artikel ini dapat kamu lihat di https://github.com/itskodinger/laravel-registry-pattern

 

Digital Ocean baner

Copyright © Kodinger 2018. Powered by Multinity

X