Apa Itu Facades Pada Laravel Dan Bagaimana Cara Kerjanya
- Published on
- -6 mins read
- Authors
- Name
- Muhammad Iqbal
- @dibaliqaja
Pengantar
Bagi para Artisan
Laravel, seringkali menjumpai yang namanya Facades. Apa itu dan bagaimana cara kerjanya.
Berdasarkan dari official dokumentasi Laravel, facade sendiri merupakan
- Penyedia antarmuka "statis" ke class yang tersedia di dalam service container aplikasi
- Berfungsi sebagai "proxy static" untuk mendasari class di dalam service container aplikasi
- Laravel sendiri mempunyai banyak facade yang disediakan hampir untuk semua fitur yang ada pada Laravel
Sebelum masuk lebih dalam mengenai facade, penting untuk memahami apa itu static methods dan non-static methods pada PHP.
Static Methods
Pada static methods, kita tidak diharuskan membuat instance class baru untuk mereferensikan. Static methods menggunakan titik dua ganda (::) untuk mengakses properti atau method
<?php
class Person { const NAME = 'John';}
echo Person::NAME; // John
Kata kunci yang sudah ada untuk menggunakan static methods yaitu self
, static
, parents
dimana digunakan untuk
mereferensikan properti atau method dalam suatu class
<?php
class Person { private const NAME = "John"; public static function name() { echo self::NAME; }}
Person::name(); // John
Non-static Methods
Non-static methods mengharuskan class tertentu dibuat instance-nya. Yang artinya, mereka membutuhkan turunan dari class untuk dieksekusi
<?php
class Person { public function name($name) { echo $name; }}
$person = new Person; // Membuat instance class baru$person->name('John'); // John
Sekarang setelah kita membahas static methods dan non-static methods saatnya kita bisa lebih mengetahui tentang facade pada Laravel.
Laravel Facades
Pada direktori vendors > laravel > framework > src > Illuminate > Support > Facades
,
ada berbagai daftar file facade yang disertakan oleh Laravel secara default.
Jadi facade pada Laravel nantinya dapat didefinisikan menggunakan namespace Illuminate\Support\Facades
.
Di dalam direktori Facades akan terlihat seperti berikut struktur filenya
Kita akan mencoba menggunakan kode yang ada pada Log.php
untuk mengetahui facade lebih detail.
<?php
namespace Illuminate\Support\Facades;
class Log extends Facade{ /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'log'; }}
Di dalam class Log
, kita memiliki protected access modifier method yaitu getFacadeAccessor()
dan apa yang dilakukan oleh method tersebut
hanyalah mengembalikan 'log'.
Dengan mengembalikan (return) nama facade 'log' ini, kita dapat mengakses facade dimana saja pada Laravel tanpa harus menginialisasi terlebih dahulu.
Jadi kita bisa melakukan sesuatu seperti Log::info('Hello info');
dimana pun berada dengan sangat mudah.
Seperti yang kita lihat, facade membuat kode kita lebih mudah untuk dibaca, lebih teratur, dan membuat pengujian (unit testing) lebih mudah untuk dilakukan.
Bagaimana membuat Facades pada Laravel
Pada bagian ini, kita akan mencoba untuk membuat facade sendiri. Tujuannya yaitu untuk memahami bagaimana cara kerja facade pada Laravel.
Kita akan mulai dengan membuat PersonFacade
yang akan meng-extend properti dari basis Facades yang mengembalikan properti nama.
Properti nama ini akan bertipe string dan akan dikembalikan setiap kali kita membuat instance class baru.
Kita tidak akan membuat facade menggunakan konvensi Laravel yang ada, dimana kita akan membuat file baru didalam folder bernama facade
dibawah folder app
.
Yang nanti diperlukan juga mendaftarkannya pada config providers yang ada pada Laravel.
Jadi, disini kita akan memanfaatkan satu file saja menggunakan web.php
yang ada pada folder routes
.
Karena kita hanya akan mencoba melihat bagaimana facade itu bekerja pada sistem Laravel.
Mari kita mulai dengan file web.php
seperti dibawah
<?php
// use Illuminate\Support\Facades\Route;
/*|--------------------------------------------------------------------------| Web Routes|--------------------------------------------------------------------------|| Here is where you can register web routes for your application. These| routes are loaded by the RouteServiceProvider within a group which| contains the "web" middleware group. Now create something great!|*/
// Route::get('/', function () {// return view('welcome');// });
class Person { public function persons() { return 'John'; }}
app()->bind('person', function() { return new Person;});
Kita telah membuat class Person
, dan didalamnya kita memiliki non-static method name()
yang mengembalikan sebuah string.
Kemudian kita memanggil bind method untuk membuatnya selalu menginstansiai person baru sehingga kita tidak perlu melakukannya secara manual lagi.
Selanjutnya, mari kita buat basis class Facade tetap dalam file web.php
yang sama
<?php
// use Illuminate\Support\Facades\Route;
/*|--------------------------------------------------------------------------| Web Routes|--------------------------------------------------------------------------|| Here is where you can register web routes for your application. These| routes are loaded by the RouteServiceProvider within a group which| contains the "web" middleware group. Now create something great!|*/
// Route::get('/', function () {// return view('welcome');// });
class Person { public function persons() { return 'John'; }}
app()->bind('person', function() { return new Person;});
class Facade { public static function __callStatic($name, $args) { return app()->make(static::getFacadeAccessor())->$name(); }
protected static function getFacadeAccessor() { // override }}
Setiap facade yang kita buat nantinya akan meng-extend properti dari basis class facade itu sendiri.
Di dalam class Facade
kita memiliki magic method yaitu __callStatic()
yang membantu kita untuk resolve static::getFacadeAccessor()
dari container dengan menggunakan app()->make()
. Dengan itu kita dapat mengakses properti $name
.
class PersonFacade extends Facade { protected static function getFacadeAccessor() { return 'person'; }}
Disini, PersonFacade
mewarisi basis properti facade. Kemudian kita mengganti getFacadeAccessor()
dan menentukan nilai yang dikembalikan menjadi apapun yang kita miliki setiap kali kita membuat instance di person yang terikat diatas.
dd(PersonFacade::persons()); // John
Saat kita mencoba memanggil facade yang telah kita buat, dia akan mengembalikan "John" seperti yang telah kita ekspektasikan. Kode lengkapnya akan terlihat seperti berikut
<?php
// use Illuminate\Support\Facades\Route;
/*|--------------------------------------------------------------------------| Web Routes|--------------------------------------------------------------------------|| Here is where you can register web routes for your application. These| routes are loaded by the RouteServiceProvider within a group which| contains the "web" middleware group. Now create something great!|*/
// Route::get('/', function () {// return view('welcome');// });
class Person { public function persons() { return 'John'; }}
app()->bind('person', function() { return new Person;});
class Facade { public static function __callStatic($name, $args) { return app()->make(static::getFacadeAccessor())->$name(); }
protected static function getFacadeAccessor() { // override }}
class PersonFacade extends Facade { protected static function getFacadeAccessor() { return 'person'; }}
dd(PersonFacade::persons()); // John
Penutup
Jadi, pada Laravel, hampir semua layanan (service) memiliki facade class.
Dimana class ini meng-extend class basis facade yang merupakan bagian dari Illuminate/Support
.
Satu-satunya hal yang perlu diterapkan adalah method getFacadeAccessor()
,
yaitu mengembalikan nama service yang ada dalam container.
Dengan memanfaatkan facade juga dapat membuat kode kita lebih mudah untuk dibaca, lebih teratur, dan membuat pengujian (unit testing) lebih mudah untuk dilakukan.
Sekian dan Semoga bermanfaat. Sampai Jumpa.
Referensi: