Tags

, ,

Lanjutan dari tulisan sebelumnya. Berikut ini adalah contoh-contoh penggunaan behavior.

Contoh-contoh berikut untuk Yii2.

Inject property

Misal kita ingin memperluas component Yii::$app->user sehinggah punya property sesuai dengan profil user seperti nama, nik, unit kerja dan lain-lain. Kita bisa membuat behavior berikut.

/**
 * @property yiiwebUser $owner
 */
class UserBehavior extends yiibaseBehavior
{
    private $_profiles;

    private function ensureLoaded()
    {
        if ($this->_profiles === null) {
            if (!$this->owner->isGuest) {
                $this->_profiles = (new yiidbQuery())->select(['nip', 'nama', 'jabatan'])
                    ->from('user_profile')
                    ->where(['id' => $this->owner->id])
                    ->one();
            } else {
                $this->_profiles = false;
            }
        }
    }

    public function canGetProperty($name, $checkVars = true)
    {
        $this->ensureLoaded();
        return $this->_profiles && array_key_exists($name, $this->_profiles);
    }

    public function __get($name)
    {
        $this->ensureLoaded();
        return $this->_profiles && array_key_exists($name, $this->_profiles) ? $this->_profiles[$name] : null;
    }
}

Kemudian di config kita tambahkan

    'components' => [
        'user' => [
            'identityClass' => 'appmodelsUser',
            'enableAutoLogin' => true,
            'as profile' => 'pathtoUserBehavior'
        ],
        ....

Ketika user sudah login kita bisa mengakses profilnya langsung dari Yii::$app->user

$nip = Yii::$app->user->nip;
$nama = Yii::$app->user->nama;
$jabatan = Yii::$app->user->jabatan;

Inject methode

Kita juga bisa menambahkan methode pada behavior yang nantinya akan bisa diakses dari owner.

public function isManager()
{
    $this->ensureLoaded();
    return $this->_profiles && $this->_profiles['jabatan']=='manager';
}

maka kita bisa mengakses dari user

Yii::$app->isManager();

Response to event

Advertisements