Prostakov
Prostakov

Reputation: 940

Yii2 session event before close/destroy

I want to run some code every time before user session is being destroyed for any reason. I haven't found any events binded to session in official documentation. Has anyone found a workaround about this?

Upvotes: 2

Views: 1400

Answers (1)

arogachev
arogachev

Reputation: 33548

There are no events out of the box for Session component.

You can solve this problem with overriding core yii\web\Session component.

1) Override yii\web\Session component:

<?php

namespace app\components;

use yii\web\Session as BaseSession

class Session extends BaseSession
{
    /**
     * Event name for close event
     */
    const EVENT_CLOSE = 'close';

    /**
     * @inheritdoc
     */
    public function close()
    {
        $this->trigger(self::EVENT_CLOSE); // Triggering our custom event first;
        parent::close(); // Calling parent implementation
    }
}

2) Apply your custom component to application config:

'session' => [
    'class' => 'app\components\Session' // Passing our custom component instead of core one
],

3) Attach handler with one of available methods:

use app\components\Session;
use yii\base\Event;

Event::on(Session::className(), Session::EVENT_OPEN, function ($event) {
    // Insert your event processing code here
});

Alternatively you can specify handler as method of some class, check official docs.

As an alternative to this approach, take a look at this extension. I personally didn't test it. The Yii way to do it I think will be overriding with adding and triggering custom events as I described above.

Upvotes: 2

Related Questions