Skip to content

Instantly share code, notes, and snippets.

@reekoheek
Created May 12, 2015 06:53
Show Gist options
  • Save reekoheek/4c4d9526414b920acb0f to your computer and use it in GitHub Desktop.
Save reekoheek/4c4d9526414b920acb0f to your computer and use it in GitHub Desktop.
Norm Observer
# Norm Observer
Observer adalah sebuah mekanisme untuk melakukan pengaitan proses pada behavior dari data-data dalam collection.
Membuat observer dilakukan dengan menambahkan sebuah Class biasa pada `src` (perhatikan agar tidak salah menggunakan namespace). Lalu menambahkan referensi class tersebut pada config schema sebuah collection yang akan menjalankannya.
Class tersebut harus memiliki method-method yang sesuai untuk pengaitan prosesnya, sesuai perilaku data yang diinginkan.
Dengan menghubungkan collection dengan sebuah observer, hal itu berarti bahwa observer yang dihubungkan akan berjalan dalam setiap perilaku yang berjalan pada data-data collection.
Fase perilaku yang dimiliki collection data pada norm adalah sebagai berikut:
- Initialize
Saat dimana collection di-init untuk digunakan melalui perintah
`Norm::factory($collectionName)`
Method observer yang berjalan di fase ini adalah `initialized` yang akan dijalankan sesaat sesudah proses initialisasi selesai dijalankan.
- Search
Saat dimana sekumpulan data dicari dalam sebuah collection melalui perintah
`$collection->find()`
Method observer yang berjalan di fase ini adalah `searching` yang berjalan sebelum proses dan `searched` yang berjalan sesudah proses.
- Attach
Saat dimana setiap data mentah (yang diperoleh dari fase Search di atas) dihubungkan ke sistem sebagai model norm, sehingga representasi datanya menjadi model norm.
Method observer yang berjalan di fase ini adalah `attaching` yang berjalan sebelum proses dan `attached` yang berjalan sesudah proses.
- Filter
Saat dimana field-field yang dimiliki sebuah model dicek dalam sebuah aliran filter yang berupa pembersihan data, pengadaptasian data, maupun validasi. Biasanya fase ini dijalankan sesaat sebelum fase Save berjalan
Method observer yang berjalan di fase ini adalah `filtering` yang berjalan sebelum proses dan `filtered` yang berjalan sesudah proses.
- Save
Saat dimana sebuah model disimpan ke dalam collection dan ditetapkan kedudukannya dalam storage fisik. Fase ini berjalan untuk dua jenis perubahan yang terjadi baik insert maupun update. Untuk dapat membedakan kedua jenis tersebut bisa dilakukan dengan mengakses method `$model->isNew()`
Method observer yang berjalan di fase ini adalah `saving` yang berjalan sebelum proses dan `saved` yang berjalan sesudah proses.
- Remove
Saat dimana sebuah model dihapus dari collection dan storage fisik.
Method observer yang berjalan di fase ini adalah `remov`ing` yang berjalan sebelum proses dan `remov`ed` yang berjalan sesudah proses.
## Contoh:
Sebuah sistem memiliki 2 buah collection yaitu:
- Employee, sebagai data karyawan yang dimiliki satu perusahaan
- Certificate, sebagai data sertifikat yang dimiliki oleh karyawan
Kita menginginkan pada saat admin menambahkan sertifikat seorang karyawan melalui modul sertifikat, secara otomatis field certificate_count yang ada pada collection Employee bertambah.
Kedudukan mula:
**Employee**
name, certificate_count
Hasan, 0
Husein, 0
**Certificate**
name,employee
(empty)
Kegiatan:
Admin menambahkan sertifikat Bono certification untuk Husein
Kedudukan akhir:
**Employee**
name, certificate_count
Hasan, 0
Husein, 1
**Certificate**
name,employee
Bono Certification,Husein
## Kode
`config/collection/Certificate.php`
```php
<?php
use Norm\Schema\String;
use Norm\Schema\Integer;
return array(
// ini yang ditambahkan
'observers' => array(
'App\\Observer\\CertificateCounter' => null,
),
// di atas ini yang ditambahkan
'schema' => array(
'name' => String::create('name'),
'certificate_count' => Integer::create('certificate_count')
),
);
```
`src/App/Observer/CertificateCounter.php`
```php
<?php
namespace App\Observer;
class CertificateCounter {
/**
* Mengubah jumlah sertifikat yang dimiliki oleh seorang karyawan pada
* saat penambahan sertifikat baru
* @param object $model Sebuah model sertifikat yang baru saja disimpan
*/
public function saved($model)
{
// lakukan proses di dalam skup di bawah hanya jika data sertifikat
// yang telah disimpan adalah data baru (bukan data yang diubah)
if ($model->isNew()) {
// mendapatkan karyawan yang sesuai dengan data employee yang
// dimiliki certificate model
$employee = Norm::factory('Employee')
->findOne(array('name' => $model['employee']));
// menambahkan certificate_count dari karyawan yang dimaksud
$employee['certificate_count'] =
$employee['certificate_count'] + 1;
// menyimpan karyawan dengan data yang telah diubah
$employee->save();
}
}
}
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment