Created
May 12, 2015 06:53
-
-
Save reekoheek/4c4d9526414b920acb0f to your computer and use it in GitHub Desktop.
Norm Observer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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