• Как почистить сессию в laravel?

    Denormalization
    @Denormalization
    В общем я наврал, есть возможность сделать это стандартными средствами (не проснулся пока писал первое сообщение).

    В Laravel все драйверы сессий реализуют SessionHandlerInterface.

    Получить хэндлер можно с помощью:
    session()->getHandler();

    Получить ID текущей сессии можно с помощью:
    session()->getID();

    Таким образом нам нужно сделать следующее:
    - Когда пользователь входит в систему, получить ID его сессии и сохранить его в БД (например добавить в таблицу users поле sesison_id).
    - Когда админу нужно разлогинить пользователя, нужно просто вызвать:
    $user = // получаем юзера;
    session()->getHandler()->destroy($user->session_id);


    Метод destroy удалит сессию пользователя, и его выкинет из системы.
    Не проверял, но должно работать.

    Можно сделать иначе. Когда нужно выкинуть юзера из системы, можно записывать в сессию параметр (например should_logout = true).
    Добавить middleware, который при каждом запросе будет проверять есть ли в сессии этот параметр, и если есть, то удалять сессию.

    Второй вариант более универсальный, так как позволяет сделать какие-то действия перед тем как юзера выкинет из системы (например сохранить часть данных из сессии в БД, если это необходимо).
    Ответ написан
  • Как в Yii2 настроить правило валидации Unique, чтоб оно работало корректно?

    Правило unique не работает при клиентской валидации, но в доке об этом забыли упомянуть.
    В данном случае, проще всего использовать ajax валидацию поля login:
    1. В представлении включить валидацию для поля
    $form->field($model, 'login', ['enableAjaxValidation' => true]);

    2. В контроллере create/update отдать ошибки валидации
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }


    В исходном примере, если ввести корректные имя и пароль и корректный, но не уникальный логин и отправить форму, она вернется с ошибкой валидации не уникального логина. Все работает и срабатывает;)
    Ответ написан
    Комментировать