Вызов afterLogin, как?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Вызов afterLogin, как?

Сообщение belkod »

Приветствую!

В методе авторизации:

Код: Выделить всё

$model = new LoginForm;
if ($model->load(Yii::$app->request->post()) && $model->login()) {
 ......
Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
......
 
Полазив по коду, нашел, что есть метод afterLogin, к которому идет обращение:

Код: Выделить всё

    
protected function afterLogin($identity, $cookieBased, $duration)
    {
        $this->trigger(self::EVENT_AFTER_LOGIN, new UserEvent([
            'identity' => $identity,
            'cookieBased' => $cookieBased,
            'duration' => $duration,
        ]));
    }
 
Так вот, где нужно создать свой метод afterLogin, чтобы он выполнился?
Т.е. в модели User, в контроллере?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Вызов afterLogin, как?

Сообщение anton44eg »

модели User, естественно
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Re: Вызов afterLogin, как?

Сообщение belkod »

Ну я так и сделал, результат нулевой.

Этот метод располагается в /vendor/yiisoft/yii2/web/User.php
А про мой метод в /common/modules/users/models/User.php он не знает.
Что-то я делаю не то похоже...

Подскажите, как правильно попасть в этот метод?
Аватара пользователя
AlexxxT
Сообщения: 59
Зарегистрирован: 2013.02.17, 15:17
Откуда: Kiev

Re: Вызов afterLogin, как?

Сообщение AlexxxT »

Наследуйтесь от класса User и перезапишите метод afterLogin.

Код: Выделить всё

    /**
     * This method is called after the user is successfully logged in.
     * The default implementation will trigger the [[EVENT_AFTER_LOGIN]] event.
     * If you override this method, make sure you call the parent implementation
     * so that the event is triggered.
     * @param IdentityInterface $identity the user identity information
     * @param boolean $cookieBased whether the login is cookie-based
     * @param integer $duration number of seconds that the user can remain in logged-in status.
     * If 0, it means login till the user closes the browser or the session is manually destroyed.
     */
    protected function afterLogin($identity, $cookieBased, $duration) 
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Вызов afterLogin, как?

Сообщение Insolita »

а зачем свой метод? Почему просто на событие afterLogin не подписаться?
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Re: Вызов afterLogin, как?

Сообщение belkod »

Я сделал так:
/common/config/main.php

Код: Выделить всё

'components' => [
......
'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'common\modules\users\models\User',
            'loginUrl' => ['/users/default/login'],
            'on afterLogin' => function($event)
            {
                Yii::$app->user->identity->afterLogin($event);
            }
        ],
.....
/common/modules/users/models/User.php

Код: Выделить всё

......
    public function afterLogin($event)
    {
        $this->lastvisitDate = date('Y-m-d H:i:s');
        $this->save(false);
        return true;
    }
......
Так заработало!

Вот так не пошло:

Код: Выделить всё

    public function behaviors()
    {
        return [
            'timestampBehavior' => [
                'class' => TimestampBehavior::className(),
                'value' => new Expression('NOW()'),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['registerDate'],
                    \yii\web\User::EVENT_AFTER_LOGIN => ['lastvisitDate'],
                ]
            ],
        ];
    }

Если есть др. варианты, то пишите с примерами кода, в расчете на псевдо-дурака в Yii2!
Аватара пользователя
AlexxxT
Сообщения: 59
Зарегистрирован: 2013.02.17, 15:17
Откуда: Kiev

Re: Вызов afterLogin, как?

Сообщение AlexxxT »

Insolita писал(а):а зачем свой метод? Почему просто на событие afterLogin не подписаться?
Ну так ТС хотел создать свой метод.
belkod писал(а): Так вот, где нужно создать свой метод afterLogin, чтобы он выполнился?
Т.е. в модели User, в контроллере?
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Re: Вызов afterLogin, как?

Сообщение belkod »

Есть еще другие варианты решения или просто флейм? :)

Собственно можно наследовать:
/common/extensions/KPUser.php

Код: Выделить всё

namespace common\extensions;

class KPUser extends \yii\web\User {
    protected function afterLogin($identity, $cookieBased, $duration) {
        parent::afterLogin($identity, $cookieBased, $duration);
        $identity->lastvisitDate = date('Y-m-d H:i:s');
        $identity->save(false);
    }
}
 
и соотв. конфиг:
/common/config/main.php

Код: Выделить всё

        'user' => [
            //'class' => 'yii\web\User',
            'class' => 'common\extensions\KPUser',
            'identityClass' => 'common\modules\users\models\User',
            'loginUrl' => ['/users/default/login'],
            /*'on afterLogin' => function($event)
            {
                Yii::$app->user->identity->afterLogin($event);
            }*/
        ],

 
Tork
Сообщения: 3
Зарегистрирован: 2016.02.08, 13:12

Re: Вызов afterLogin, как?

Сообщение Tork »

Вот мой вариант прост и изящен)
Config:

Код: Выделить всё

        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
        ],
Модель User:

Код: Выделить всё

    public function init()
    {
        parent::init();
        Yii::$app->user->on(Yii\web\User::EVENT_AFTER_LOGIN, [$this, 'statistics']);
        Yii::$app->user->on(Yii\web\User::EVENT_BEFORE_LOGOUT, [$this, 'statistics']);
    }

    public function statistics()
    {
        $this->last_visit = gmdate('Y-m-d H:i:s');
        $this->ip_address = Yii::$app->request->getUserIP();
        $this->save(false);
    }
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вызов afterLogin, как?

Сообщение ElisDN »

Tork писал(а):Вот мой вариант прост и изящен)
Сложен и страшен :)
Tork
Сообщения: 3
Зарегистрирован: 2016.02.08, 13:12

Re: Вызов afterLogin, как?

Сообщение Tork »

Отлично отрабатывает. Если Вас ElisDN не затруднит, можете написать как Вы видите решение типа задачи на сохранение данных user-a при логине и логауте?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вызов afterLogin, как?

Сообщение ElisDN »

Tork писал(а):можете написать как Вы видите решение типа задачи на сохранение данных user-a при логине и логауте?
Если при логине, то по 'on afterLogin' как у @belkod.
Если при каждом запросе, то по 'on afterRequest' приложения.
Логаут так отследить не получится.
Tork
Сообщения: 3
Зарегистрирован: 2016.02.08, 13:12

Re: Вызов afterLogin, как?

Сообщение Tork »

А, ну это понятно. EVENT_BEFORE_LOGOUT отрабатывает только при явном логауте пользователя (нажатием кнопки логаут). Тема о ток как в целом выполнит пользовательскую функцию при событии класса Yii\web\User. Выше изложенные предложения были переопределить этот класс, вызвать пользовательскую функцию из конфигурационного файла или внедрить в поведение. Я предложил просто подписаться на необходимое событие при инициализации модели User. У вас есть лучше предложение "Вызов afterLogin, как?" :?:
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вызов afterLogin, как?

Сообщение ElisDN »

Tork писал(а):Я предложил просто подписаться на необходимое событие при инициализации модели User. У вас есть лучше предложение "Вызов afterLogin, как?" :?:
Как у @belkod:

Код: Выделить всё

'user' => [
    'class' => 'yii\web\User',
    'identityClass' => 'app\models\User',
    'loginUrl' => ['/site/login'],
    'on afterLogin' => function($event) { $user = $event->identity; ... }
],
Pa3Py6aka
Сообщения: 10
Зарегистрирован: 2016.07.12, 00:58

Re: Вызов afterLogin, как?

Сообщение Pa3Py6aka »

belkod писал(а): 2014.08.08, 19:16 Есть еще другие варианты решения или просто флейм? :)
Я сделал так, всё как у вас, только тремя строчками:

Код: Выделить всё

'user' => [
    'class' => 'yii\web\User',
    'identityClass' => 'app\models\User',
    'loginUrl' => ['/site/login'],
    'on afterLogin' => function($event) {
        Yii::$app->user->identity->updateAttributes(['last_login' => time()]);
    }
],
Ответить