6.16 PSR-20 Clock¶
PSR-20 adalah standar yang dirancang untuk menyediakan antarmuka seragam dalam menangani waktu pada aplikasi PHP. Dengan PSR-20 pengelolaan waktu menjadi lebih fleksibel, terutama untuk kebutuhan pengujian dan pengaturan waktu dinamis.
6.16.1 ClockInterface¶
PSR-20 mendefinisikan antarmuka ClockInterface
, yang menyediakan metode now()
untuk mendapatkan waktu saat ini dalam bentuk objek DateTimeImmutable
. Standar ini memungkinkan aplikasi menggunakan implementasi waktu yang dapat disesuaikan sesuai kebutuhan, baik untuk pengembangan maupun pengujian.
Antarmuka ClockInterface
didefinisikan sebagai berikut:
<?php
namespace Psr\Clock;
use DateTimeImmutable;
interface ClockInterface
{
/**
* Mengembalikan waktu saat ini sebagai objek DateTimeImmutable.
*
* @return DateTimeImmutable
*/
public function now(): DateTimeImmutable;
}
6.16.2 Cara Implementasi¶
Berikut ini merupakan berbagai cara dalam pengimplementasian PSR-20:
-
Menggunakan library pihak ketiga yang mendukung PSR-20
Apabila terdapat library pihak ketiga yang mendukung PSR-20, instalasi dapat dilakukan menggunakan Composer. Contoh library seperti
nyholm/psr20
, dengan langkah-langkah sebagai berikut:-
Jalankan perintah berikut untuk menginstal library melalui Composer
-
Setelah instalasi, library akan ditambahkan ke direktori
vendor/
-
Tambahkan
autoload.php
dari Composer ke file PHP -
Gunakan implementasi
ClockInterface
yang disediakan library
-
-
Membuat implementasi PSR-20 sendiri
Langkah-langkahnya sebagai berikut:
-
Definisikan antarmuka
ClockInterface
Buatlah file untuk mendefinisikan antarmuka di lokasi sepertisrc/Contracts/ClockInterface.php
. -
Implementasi waktu sistem
Buatlah kelas yang mengimplementasikan
ClockInterface
untuk mendapatkan waktu dari sistem. Kemudian simpan disrc/Services/SystemClock.php
. -
Implementasi waktu tetap (opsional) Untuk kebutuhan pengujian, waktu tetap dapat digunakan. Dan simpan file di
src/Services/FixedClock.php
.<?php namespace App\Services; use App\Contracts\ClockInterface; use DateTimeImmutable; class FixedClock implements ClockInterface { private DateTimeImmutable $fixedTime; public function __construct(DateTimeImmutable $time) { $this->fixedTime = $time; } public function now(): DateTimeImmutable { return $this->fixedTime; } }
-
Implementasi
Setelah implementasi selesai, pilihlah salah satu kelas
ClockInterface
sesuai kebutuhan.
-
6.16.3 Kapan Harus Menggunakan PSR-20?¶
PSR-20 sangat berguna dalam skenario berikut:
- Aplikasi dengan ketergantungan waktu Contohnya pada sistem yang memerlukan timestamp untuk transaksi atau log.
-
Pengujian unit
Dalam pengujian, waktu tetap memudahkan untuk menguji logika yang bergantung pada waktu tertentu. Misalnya menguji apakah fungsi berlaku pada jam kerja tertentu.
-
Dependency injection
Dalam hal ini kita dapat menyuntikkan sumber waktu (clock) yang berbeda ke dalam aplikasi sesuai dengan kebutuhan.
6.16.4 Keuntungan¶
- Fleksibilitas, mengacu pada sumber waktu yang dapat diubah tanpa memengaruhi logika utama aplikasi.
- Konsistensi, dengan implementasi waktu tetap, pengujian logika yang bergantung pada waktu menjadi lebih mudah.
- Testability, PSR-20 ini menjadikan kode lebih kompatibel dengan library atau framework lain.