Yii2: Action Fillter (Middleware)

Tags

, , , ,

Pengertian

Action filter atau singkatnya filter adalah objek yang dijalankan sebelum dan/atau setelah mengeksekusi suatu action. Fitur yang sama dalam laravel dikenal dengan sebutan middleware. Sebagai contoh misalnya kita ingin mengecek otoritas user sebelum diizinkan untuk menjalankan action atau untuk mengecek request method sesuai atau tidak dengan action tersebut. Filter sebenarnya adalah fitur yang sudah lama diperkenalkan oleh Yii yaitu sejak Yii1. Di Yii2 ada sedikit perombakan yaitu dengan menjadikan filter sebagai bagian dari behavior.

Cara Penggunaan

Karena filter adalah turunan dari behavior, maka cara penggunaannya adalah mendaftarkannya di method behaviors().

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['signup', 'reset-password', 'login', 'request-password-reset'],
                    'allow' => true,
                    'roles' => ['?'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

Continue reading

Membuat Framework PHP Sederhana (2)

Tags

, , ,

Tulisan ini dimaksudkan hanya untuk pembelajaran. Memahami bagaimana cara kerja suatu framework. Untuk membuat aplikasi yang lebih serius, silakan menggunakan framework yang lebih serius juga seperti Yii2 misalnya.

Lanjutan dari tulisan sebelumnya Membuat Framework PHP Sederhana. Kali ini kita buat dengan full OOP. Di sini ada tiga class utama yaitu Dee, DApp dan DController.

class Dee

Class Dee adalah class helper. Fitur penting dari class ini adalah class autoloader. Dengan class autoloader kita tidak perlu menginclude file class secara manual. Dia akan secara otomatis membaca nama class kemudian mencari file yang mendefinisikan class itu dan meng-include-nya.

public static function autoload($class)
{
    if (isset(static::$classMap[$class])) {
        include static::$classMap[$class];
        return true;
    } else {
        foreach (self::$_paths as $i => $path) {
            if (strncmp($path, '@app/', 5) === 0) {
                self::$_paths[$i] = $path = static::$app->basePath . substr($path, 4);
            }
            if (is_file("{$path}/{$class}.php")) {
                include "{$path}/{$class}.php";
                return true;
            }
        }
    }
    return false;
}

Dee::$classMap = require(__DIR__ . '/classes.php');
spl_autoload_register(['Dee', 'autoload']);

Continue reading

Membuat Framework PHP Sederhana

Tags

, , ,

Tulisan ini dimaksudkan hanya untuk pembelajaran. Memahami bagaimana cara kerja suatu framework. Untuk membuat aplikasi yang lebih serius, silakan menggunakan framework yang lebih serius juga seperti Yii2 misalnya.

Framework di sini maksudnya adalah kerangka kerja. Yaitu, template aplikasi yang dengannya kita membangun keseluruhan projek kita. Kita bisa belajar membuatnya sendiri secara sederhana. Karena masih sangat sederhana, kita belum akan menggunakan OOP. Ok, Apa tujuan yang hendak dicapai dari framework ini? Setidaknya ada dua tujuan dari dibuatnya framework ini yaitu pengorganisasian file dan templating.

  1. Pengorganisasian File.
    Di sini kita akan memisahkan antara logic program (controler) dengan tampilannya (view). Tujuannya agar aplikasi menjadi lebih rapi dan mudah dibaca.
  2. Templating.
    Seringkali aplikasi kita memiliki outline yang sama untuk setiap page. Yang berubah hanya kontennya saja. Untuk itu kita akan menerapkan layouting.

Sebagai gambaran, setruktur aplikasi kita akan berbentuk

protected
  controllers
    ctrl1.php
    ctrl2.php
  views
    layout.php
    view1.php
    view2.php
  lib.inc.php
index.php

Continue reading

Buhaitsah. Siapa Dia?

Tags

, , , ,

Dalam sejarah orang Arab, semasa jahiliyah, sebelum kedatangan Islam ada perang yang sangat terkenal. Perang itu dipanggil harbu dahis atau perang dahis. Perang yang berlangsung selama 40 tahun disebabkan perlombaan kuda. Dahis adalah nama bagi seekor kuda yang laju milik Qais bin Zuhair Al-absyi, tokoh Arab. Seekor lagi namanya Al-ghabra’ milik Huzaifah bin Badar Az-zibyani dari bani Zibyan. Pasal, kuda-kuda arab yang terkenal, mereka ada nama mereka sendiri.

Peperangan bermula apabila terjadi krisis antara kedua kabilah ini, ‘Absy dan Zibyan. Diceritakan, salah satu kabilah ada mengacau kawasan yang diprotek oleh kabilah lainnya. Di dalam nak selesaikan pertikaian itu, mereka adakan lomba kuda. Perlombaan itu mengambil masa banyak hari. Merentasi padang pasir, melerengi bukit, hutan dan sebagainya.

Hanya saja, zibyan ada tipu sikit. Bila dahis coba potong ghabra’, zibyan curi perhatian dahis sehinggah dahis tak dapat tumpukan perhatian dan tak dapat menang. Akhirnya ghabra’ menang. Terbukti tipu, bergaduh lagi. Tak selesai masalah. Maka berlakulah perang dahis, 40 tahun bunuh membunuh sesama mereka.
Macam mana peperangan itu boleh berhenti. Itu yang kita nak cerita. Continue reading

Yii2: Tutorial Tabular Input

Tags

, ,

Tutorial ini memerlukan ekstensi mdmsoft/yii2-widgets dan mdmsoft/yii2-ar-behavior.

Persiapan Database

Untuk contoh, kita gunakan tabel yang sederhana saja. Order dan OrderItem. Buat migration-nya

use yii\db\Migration;

class m160320_191634_order extends Migration
{
    public function up()
    {
        $tableOptions = null;
        if ($this->db->driverName === 'mysql') {
            // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
            $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
        }
        $this->createTable('{{%order}}', [
            'id' => $this->primaryKey(),
            'date' => $this->date()->notNull(),
            'keterangan' => $this->string(128),
            ], $tableOptions);

        $this->createTable('{{%order_item}}', [
            'id' => $this->primaryKey(),
            'order_id'=>  $this->integer()->notNull(),
            'product'=>  $this->string(64)->notNull(),
            'qty' => $this->integer()->notNull(),
            'FOREIGN KEY (order_id) REFERENCES {{%order}} (id) ON DELETE CASCADE ON UPDATE CASCADE'
            ], $tableOptions);
    }

    public function down()
    {
        $this->dropTable('{{%order_item}}');
        $this->dropTable('{{%order}}');
    }
}
php yii migrate

Continue reading

Mazhab Pemikiran Dalam Programing

Tags

, ,

Sebelum saya masuk ke tajuk utama. Saya tekankan, ini hanyalah salah satu pandangan di antara beberapa pandangan yang ada yang saya anggap paling rajih. Tak lah karena tidak bersesuaian dengan pandangan ini, lantas terkeluar dari ahlu programer wal jama’ah.

Ok. Apa pandangan yang saya pilih dalam perkara ini? dalam bab ini, saya cenderung memilih mazhab taisir/muyassar, mazhab yang mudah. Maksudnya, jika ada beberapa cara yang sama benarnya, maka saya memilih cara yang paling mudah. Itu intinya. Sedangkan definisi mudah itu sendiri akan dijelaskan dalam beberapa bahagian yaitu kesederhanaan dan kompatibilitas.

Kesederhanaan.

Kesederhanaan saya letakkan pada poin pertama karena, sesetengah orang sering menilai kehebatan program itu pada kerumitannya, pada keglamorannya. Itu tidak betul. Programing adalah sains, pada saat yang sama, dia juga seni. Sebagai sebuah seni, kecantikanya akan terlihat ketika dia tetap mempertahankan kesederhanaannya.
Sederhana di sini maksudnya adalah, kode yang ditulis harus sesedikit mungkin, dependensi yang diinstal juga harus seminimal mungkin, kodenya memiliki alur yang jelas dan tidak redundan. Termasuk juga dalam cakupan sederhana adalah, memastikan bahwa fungsi yang dibuat tetap memiliki tubuh yang ramping. Sama ada dengan menulis balik logicnya atau dengan membahaginya menjadi beberapa fungsi yang lain. Beberapa IDE, netbeans misalnya, dapat diatur untuk memberikan warning jika suatu function melebihi jumlah baris tertentu. Continue reading

Tutorial Penggunaan mdmsoft/yii2-admin (3)

Tags

, , ,

Lanjutan dari tulisan sebelumnya tutorial penggunaan yii2-admin.

Instalasi

Cara install yang paling mudah tentunya denga composer.

composer require mdmsoft/yii2-admin "~2.0"

Atau tambahkan di bagian require di file composer.json

"mdmsoft/yii2-admin": "~2.0"

Lalu kemudian lakukan composer update. Cara lainnya -walau sangat tidak disarankan- adalah dengan mengunduh source-nya di sini. Setelah download, extrak filenya ke sebarang tempat lalu tambahkan alias di config aplikasi.

'aliases' => [
    ...
    '@mdm/admin' => 'path/to/extrak/dir'
],

Continue reading

Tutorial Penggunaan mdmsoft/yii2-admin (2)

Tags

, , ,

Ini tulisan kedua dari tulisan sebelumnya Tutorial yii2-admin 1. Ternyata lebih cepat dari perkiraan semula :D. Kita masih belum akan ke instalasi dan konfigurasi. Kita masih akan mendalami konsep RBAC itu sendiri. Karena secara teori, kalau paham konsep RBAC, harusnya akan lebih mudah menggunakan yii2-admin. Kali ini kita akan bahas lebih banyak tentang rule.

Membuat Rule

Rule dibuat dengan meng-extends class yii\rbac\Rule dan mengoverride method execute(). Kita buat contoh yang lebih mudah dulu. Misal ada user yang sama-sama dapat permission update_post. Tetapi ada tambahan aturan yaitu hanya boleh mengedit artikel yang dia tulis saja. Maka rulenya

namespace app\components;

use yii\rbac\Rule;

class OnlyAuthor extends Rule
{
    public function execute($user, $item, $params)
    {
        $model = $params['post'];
        return $user->id == $model->author_id;
    }
}

Continue reading

Tutorial Penggunaan mdmsoft/yii2-admin (1)

Tags

, , , , ,

Insyaallah ini adalah bagian pertama dari tutorial tentang yii2-admin. Sudah lama sebenarnya pingin nulis tentang topik ini, sayangnya saya sendiri bukan penulis yang cakap :D. Lucunya, yii2-admin sudah dibuat translationnya dalam 15 bahasa, tapi bahasa indonesia sendiri belum ada.

Pengenalan RBAC (Role Base Access Control)

Sebelum menggunakan yii2-admin kita harus paham dulu konsep RBAC yang dipakai oleh Yii2. RBAC sendiri secara sederhana dapat diartikan dengan pemberian hak akses berdasarkan role. Lalu… Role itu sendiri apa? Kita bahas di bawah beserta istilah-istilah yang lain.

Role dan Permission

Role dimaksudkan sebagai kumpulan dari beberapa job secara umum. Secara logika, role seharusnya lebih mendeskripsikan tentang user itu sendiri alih-alih tentang jobnya. Contoh role misalnya adalah manager, karyawan, hrd, admin dan lain-lain. Dari nama role sendiri, kita belum bisa membayangkan deskripsi pekerjaannya. Untuk itu diperkenalkan istilah permission.
Secara fisikal, role dan permission adalah sama. Permission adalah kumpulan dari beberapa job juga. Hanya saja, jika role lebih mendeskripsikan usernya, maka permission lebih mendeskripsikan jobnya itu sendiri. Contoh permission misalnya, create_cuti, apparove_lembur, update_user dan lain-lain. Continue reading