Selasa, Mei 13, 2014

Memanfaatkan Facades pada Framework Laravel

"Facades provide a "static" interface to classes that are available in the application's IoC container."

Terjemahan bebas dari saya adalah Facades menyediakan antar muka static pada semua kelas yang ada dalam Laravel, biasanya Model. Untuk lebih mengerti mengenai apa itu Inversion of Control (IoC) container dan Facade silahkan anda membaca artikel karya Edd Mann yang berjudul How Static Facades and IoC are used in Laravel. Salah satu fitur menarik dari framework Laravel adalah Facades, Facade ada dimana-mana pada Laravel, bahkan tanpa sadar kita juga sudah sering menggunakannya, misalnya statement View::make('form'), Redirect::to('front'), Input::get('nama'), dsb. Misalnya kita memiliki sebuah kelas model dalam aplikasi Laravel kita seperti ini:

namespace AhliInformasi;
class Pustakawan {
  /**
   * Ambil semua data Pustakawan
   */
  public function semuaPustakawan($offset=0, $limit=100) {
    return DB::table('pustakawan')->select(DB::Raw('id,
        nama_pustakawan,
        tingkatan.nama as tingkatan_pustakawan,
        status.nama as status_pustakawan,
        email_pustakawan, 
   foto_pustakawan'))
      ->join('tingkatan', 'pustakawan.tingkatan', '=', 'tingkatan.id')
      ->join('status', 'pustakawan.status', '=', 'status.id')
      ->orderBy('login_terakhir', 'desc')->skip($offset)->take($limit);
  }

  /**
   * Ambil detail data Pustakawan
   */
  public function seorangPustakawan($id_nya) {
    return DB::table('pustakawan')->where('id', '=', $id_nya)->first();
  }
}

Model tersebut kita simpan dengan nama AhliInformasi/Pustakawan.php (karena kita menggunakan namespace disini) dalam direktori model. Nah biasanya ketika kita memanggil model ini di controller kita melakukannya dengan seperti ini:

class PustakawanController extends BaseController {
  /**
   * Ambil semua data Pustakawan
   */
  public function lihatSemuaPustakawan($offset=0, $limit=100) {
    $pustakawan = new \AhliInformasi\Pustakawan;
    $view_data['data_pustakawan'] = $pustakawan->semuaPustakawan($offset, $limit);
    return View::make('ahliinformasi.index', $view_data);
  }
}

Dengan memanfaatkan Facades kita bisa lebih mempersingkat pemanggilan model kita sekaligus lebih ekspresif dan juga lebih mudah di-tes. Untuk menjadikan model kita menjadi Facade maka kita akan menambahkan sedikit kode, yang pertama adalah "mengikat" atau bahasa kerennya binding model kita sebagai IoC Container. Cara paling elegan adalah dengan menambahkan Service Provider:

namespace AhliInformasi;
use Illuminate\Support\ServiceProvider;
class PustakawanServiceProvider extends ServiceProvider {
    public function register()
    {
        $this->app->bind('pustakawan', function()
        {
            return new \AhliInformasi\Pustakawan;
        });
    }
}

Simpan file dengan nama PustakawanServiceProvider.php pada direktori model/AhliInformasi. Kemudian tambahkan juga implementasi kelas Facade kita dengan kode berikut ini:

namespace AhliInformasi;
use Illuminate\Support\Facades\Facade;
class PustakawanFacade extends Facade {
  protected static function getFacadeAccessor() { return 'pustakawan'; }
}

Kemudian simpan dengan nama PustakawanFacade.php pada direktori model/AhliInformasi. Langkah selanjutnya adalah me-register Service Provider dan Facade kita pada file konfigurasi config/app.php, dengan menambahkan:

'providers' => array(

  'Illuminate\Foundation\Providers\ArtisanServiceProvider',
  'Illuminate\Auth\AuthServiceProvider',
  'Illuminate\Cache\CacheServiceProvider',
  'Illuminate\Session\CommandsServiceProvider',
  ...
  'AhliInformasi\PustakawanServiceProvider' // tambahkan ini

),
...
'aliases' => array(

    'App'             => 'Illuminate\Support\Facades\App',
    'Artisan'         => 'Illuminate\Support\Facades\Artisan',
    'Auth'            => 'Illuminate\Support\Facades\Auth',
    'Blade'           => 'Illuminate\Support\Facades\Blade',
    'Cache'           => 'Illuminate\Support\Facades\Cache',
    'ClassLoader'     => 'Illuminate\Support\ClassLoader',
    ...
    'Pustakawan'      => 'AhliInformasi\PustakawanFacade' // tambahkan ini
),

Terakhir jangan lupa untuk men-generate ulang file autoload.php agar kelas-kelas kita yang baru kita buat dikenali langsung oleh aplikasi (tanpa harus include/require manual), dengan menjalankan perintah berikut dengan menggunakan terminal pada direktori root aplikasi Laravel:

composer dump-autoload

Jujur sebenarnya saya juga bingung kenapa harus melakukan proses dump-autoload, karena seharusnya semua kelas yang ada di dalam direktori model secara otomatis di-load oleh Laravel pada saat proses bootstrap, tetapi ketika saya tidak melakukan proses ini muncul error kelas Service Provider tidak ditemukan. Selanjutnya dan seterusnya untuk memanggil model Pustakawan kita bisa langsung memanggilnya melalui Facade kita dengan seperti ini:

class PustakawanController extends BaseController {
  /**
   * Ambil semua data Pustakawan
   */
  public function lihatSemuaPustakawan($offset=0, $limit=100) {
    $view_data['data_pustakawan'] = Pustakawan::semuaPustakawan($offset, $limit);
    return View::make('ahliinformasi.index', $view_data);
  }
}

Nah itu penjelasan mengenai Facades pada Laravel, semoga bermanfaat!