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'],
            ],
        ],
    ];
}

Filter dapat diattach secara lokal di masing-masing controller atau secara global di application. Contoh penggunaan filter secara global adalah seperti access control mdmsoft/yii2-admin.

    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            'admin/*',
        ]
    ],

Membuat Filter Sendiri

Kita dapat membuat filter sendiri dengan mengextendsnya dari yii\base\ActionFilter kemudian mengoverride method beforeAction() dan/atau afterAction().

namespace app\components;

use Yii;
use yii\base\ActionFilter;

class ActionTimeFilter extends ActionFilter
{
    private $_startTime;

    public function beforeAction($action)
    {
        $this->_startTime = microtime(true);
        return parent::beforeAction($action);
    }

    public function afterAction($action, $result)
    {
        $time = microtime(true) - $this->_startTime;
        Yii::trace("Action '{$action->uniqueId}' spent $time second.");
        return parent::afterAction($action, $result);
    }
}

Filter dapat juga digunakan untuk memanipulasi hasil akhir dari suatu action. Misal kita bekerja dengan ajax dan ingin mengubah hasil dari action menjadi format json, maka kita bisa melakukannya di afterAction().

    public function afterAction($action, $result)
    {
        return json_encode($result); // $result adalah nilai kembalian dari action.
    }

Core Filter

Yii2 secara default telah menyertakan beberapa filter yang sangat berguna. Antara lain

  • yii\filters\AccessControl
    AccessControl menyediakan cara yang mudah untuk mengecek otorisasi user. Filter ini juga akan secara otomatis mengarahkan ke login page jika user belum login.
  • Authentication Method Filters
    Digunakan untuk melakukan otentikasi user. Biasa dipake dalam REST. Metode otentikasi yang disediakan adalah HttpBasicAuth, HttpBearerAuth dan QueryParamAuth.
  • Content Negotiator
    Digunakan untuk menformat hasil akhir menjadi json atau xml.
  • Verb Filter
    Digunakan untuk mengecek request method terhadap suatu action. Dengan ini kita bisa membatasi suatu action hanya bisa diakses melalui POST, GET, HEAD dan lain-lain.

Untuk filter-filter yang lain dapat dibaca secara lengkap di sini

Advertisements