Sebagai pengguna Framework PHP yang menurut saya heavyly opiniated  seperti CakePHP dan Yii  (debatable sih kalo Yii2) maka menggunakan Framework seperti Laravel dan CodeIgniter seringkali membuat saya rindu dengan koding dengan FW yang opiniated. Namun tentunya kuli kode harus banyak mencari cara agar koding menjadi lebih mudah. Untuk itu dalam tulisan ini saya ingin berbagi beberapa tips dan trik untuk mempermudah pengalaman koding anda dengan Laravel.

Auto Model Validation

Salah satu konsep pada Yii2 adalah Model bertindak sebagai jembatan antara database dan aplikasi. Namun tentunya tidak sekaku itu. Sebagai jembatan antara aplikasi dan database maka pada Yii2, model juga menyimpan konfigurasi untuk memvalidasi data yang masuk, menggunakan fungsi rules. Pada laravel di banyak contoh dan tutorial menggunakan pendekatan clean code dimana model dan validasinya dipisahkan. Dengan asumsi tidak selamanya model perlu divalidasi terlebih dahulu. Lalu bagaimana jika saya ingin selalu memvalidasi setiap pergerakan data pada database (create dan update). Kita bisa menggunakan cara ini pada model

class Post extends Eloquent
{
  public staic $autoValidates = true;
  protected static $rules = [];
  protected static function boot()
  {
    parent::boot();
    // or static::creating, or static::updating
    static::saving(function($model)
    {
      if ($model::$autoValidates) {
        return $model->validate();
      }
    });
  }
  public function validate()
  {
      // your validation here
  }
}

Bekerja dengan UUID

UUID adalah salah satu yang paling tricky dalam Framework PHP. Di Yii2 saya biasa menggunakan ekstension dan langsung menambahkan Class ekstension tersebut pada behavior model. Hanya menambahkan satu baris kode tanpa harus mengubah CRUD operation pada controller. Pada Laravel ini menjadi sedikit lebih banyak langkah yang harus ditempuh namun achievable. Pada contoh ini kita menggunakan package yang sama yang digunakan pada Yii2 (hanya saja sudah di wrapped agar mudah digunakan di Yii2) yaitu dari Ramsey\UUID. 

use Ramsey\Uuid\Uuid;

trait UUIDModel
{
  public $incrementing = false;

  protected static function boot()
  {
    parent::boot();
    static::creating(function ($model)
    {
      $key = $model->getKeyName();
      if (empty($model->{$key})) {
        $model->{$key} = (string) $model->generateNewUuid();
      }
    });
  }

  public function generateNewUuid()
  {
    return Uuid::uuid4();
  }
}

Collection Filters

Pada Yii2  kita biasa menggunakan dataProvider dan filter/condition dapat dilakukan secara prosedural karena query yang digunakan tidak langsung dieksekusi sebelum dataProvider selesai memberikan output. Pada Laravel Eloquent magic dapat ditempuh dengan memanggil static method All dan langsung memberikan collection. Namun apakah kita masih bisa membuat filter setelah query ditutup dengan All. Ternyata hal itu masih dapat dilakukan. Namun saya tidak tahu persis apakah cara ini memodifikasi filter pada array atau database, nanti jika sudah tahu akan saya update pada tulisan ini. Cara ini kita menggunakan callback function pada Filter seperti di bawah ini.

$customers = Customer::all();

$us_customers = $customers->filter(function($customer)
{
	return $customer->country == 'United States';
});

Share Cookies Between Domains

Ini mungkin salah satu hal termudah yang ada pada Laravel namun belum ada cara simpelnya pada Yii2. Pada Yii2 cookies dapat dishare bersama namun pengaturannya ada pada level aplikasi (dengan menggunakan advance template). Namun pada Laravel pendekatannya dapat dilakukan  dengan mudah dan situasional pada cookie tertentu (dengan syarat security hash pada kedua aplikasi sama) dengan cara berikut.

// app/Http/Middleware/EncryptCookies.php
protected $except = [
	'shared_cookie',
];

Cookie::queue('shared_cookie', 'my_shared_value', 10080, null, '.example.com');

Demikian tips dan trik sederhana yang bisa meng-improvise pengalaman koding anda, dan mungkin akan bertambah seiring waktu. Semoga bermanfaat dan Happy Coding!