Tags

, , ,

Yii2 secara default telah memiliki component untuk menyimpan cache dan session ke database. Sayangnya, tidak seperti di Yii1 yang otomatis meng-create table jika belum ada. Di Yii2 tablenya harus dibuat lebih dahulu secara manual (atau lewat migration). Tentu ini tidak jadi masalah kalau kita menyimpannya di database yang permanent.
Screenshot from 2016-02-16 09:22:25
Masalahnya adalah, kalau kita menyimpannya di sqlite di folder runtime misalnya. Filenya bisa saja sewaktu-waktu terhapus. Akan sangat merepotkan kalau harus membuat ulang table yang sama. Karena itu ane meng-extends component yang sudah ada dan memberikan tambahan fitur create table otomatis.

<?php

namespace common\classes;

class DbSession extends \yii\web\DbSession
{

    public function init()
    {
        parent::init();
        $this->createTable();
    }

    protected function createTable()
    {
        if ($this->db->schema->getTableSchema($this->sessionTable) === null) {
            $cmd = $this->db->createCommand();
            $cmd->createTable($this->sessionTable, [
                'id' => 'CHAR(40) PRIMARY KEY',
                'expire' => 'integer',
                'data' => 'binary',
            ])->execute();
        }
    }
}
<?php

namespace common\classes;

class DbCache extends \yii\caching\DbCache
{

    public function init()
    {
        parent::init();
        $this->createTable();
    }

    protected function createTable()
    {
        if ($this->db->schema->getTableSchema($this->cacheTable) === null) {
            $cmd = $this->db->createCommand();
            $cmd->createTable($this->cacheTable, [
                'id' => 'CHAR(128) PRIMARY KEY',
                'expire' => 'integer',
                'data' => 'binary',
            ])->execute();
        }
    }
}

Kalau sudah, cara memakainya adalah tambahkan di config/main-local.php

return [
    'components' => [
        ...
        'session' => [
            'class' => 'common\classes\DbSession',
            'db' => ['dsn' => 'sqlite:@runtime/data.sqlite'], // <- optional, boleh dikosongi
        ],
        'cache' => [
            'class' => 'common\classes\DbCache',
            'db' => ['dsn' => 'sqlite:@runtime/data.sqlite'],
        ],
    ],
];
Advertisements