Не работает редирект после вызова метода другой модели

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

Не работает редирект после вызова метода другой модели

Сообщение MOP3E »

На странице две формы - одна для ввода логина/пароля, другая для перехода на страницу регистрации. Проверяю логин/пароль пользователя через базу данных. После успешной проверки пытаюсь делать редирект на другую страницу сайта. Редирект не выполняется, хотя, судя по trace, этот программный код выполняется. Если убрать проверку - редирект выполняется если заполнены поля формы. На страницу регистрации (из другой формы) редирект выполняется всегда. Посоветуйте, что можно сделать. Я в Yii2 новичок.

UPD: Выяснил, что редирект не срабатывает после вызова из модели формы метода любой другой модели. Не важно, какого - статического или динамического - даже если этот метод пустой. Пробовал создавать абсолютно новую пустую модель, просто "чистый" класс без наследования чего либо - результат один и тот же: после обращения к методу класса подвисает редирект.

Код в контроллере:

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

/**
 * Отображает стартовую страницу сайта.
 *
 * @return string
 */
public function actionIndex()
{
    // создать объёкт модели
    $model = new IndexLoginForm();

    //проверить, не получила ли модель данные из формы?
    if($model->load(Yii::$app->request->post()))
    {
        //если нажата кнопка на форме перехода на страницу регистрации
        if($model->name == 'REGISTER' && $model->password == 'REGISTER')
        {
            //выполнить редирект на страницу регистрации
            $this->redirect(['site/register']);
        }
        else
        {
            //если данные введены корректно
            if($model->validate())
            {

                //выполнить редирект на страницу пользователя
                if($model->validateLogin())
                {
                    Yii::trace('Выполняется редирект на user/index.');
                    $this->redirect(['user/index']);
                }
                else
                {
                    // даныне некорректны - отрендерить представление
                    return $this->render('index', ['model' => $model]);
                }
            }
        }
    }
    else
    {
        // даныне не получены, либо некорректны - отрендерить представление
        return $this->render('index', ['model' => $model]);
    }
}
Код для проверки существования логина:

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

/**
 * Проверка существования пользователя (логина) после ввода логина/пароля.
 * Если логин есть в базе данных - возвращается истина.
 */
public function validateLogin()
{
    if (!$this->hasErrors()) {
        if (User::findOne(['login' => $this->name])) {
            //TODO: здесь должна быть ещё проверка пароля
            return true;
        }
    }
    return false;
}
Последний раз редактировалось MOP3E 2017.05.27, 12:37, всего редактировалось 4 раза.
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после обращения в базу данных

Сообщение Maxim Glushko »

Ставьте в сомнительных местах

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

echo 'точка 1';
exit();
или

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

print_r($сомнительная_переменная);
exit();
Ещё показ ошибок можно включить.
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

немного изменил логику работы, но проблема никуда не делась:

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

    /**
     * Отображает стартовую страницу сайта.
     *
     * @return string
     */
    public function actionIndex()
    {
        // создать объёкт модели
        $model = new IndexLoginForm();

        //проверить, не получила ли модель данные из формы?
        if($model->load(Yii::$app->request->post()))
        {
            //если нажата кнопка на форме перехода на страницу регистрации
            if($model->name == 'REGISTER' && $model->password == 'REGISTER')
            {
                //выполнить редирект на страницу регистрации
                SiteController::$result11 = 2;
                return $this->redirect(['site/register']);
            }
            else
            {
                //если данные введены корректно
                if($model->validate())
                {
                    /*!!!!! ЕЩЁ ОДИН НЕРАБОТАЮЩИЙ РЕДИРЕКТ !!!!!*/
                    //выполнить редирект на страницу пользователя
                    if($model->validateLogin())
                    {
                        SiteController::$result11 = 1;
                        return $this->redirect(['user/index']);
                    }
                }
            }
        }
        // даныне не получены, либо некорректны - отрендерить представление
        return $this->render('index', ['model' => $model]);
    }
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

В логах обращения к базе данных вот такая запись:

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

	SELECT
    kcu.constraint_name,
    kcu.column_name,
    kcu.referenced_table_name,
    kcu.referenced_column_name
FROM information_schema.referential_constraints AS rc
JOIN information_schema.key_column_usage AS kcu ON
    (
        kcu.constraint_catalog = rc.constraint_catalog OR
        (kcu.constraint_catalog IS NULL AND rc.constraint_catalog IS NULL)
    ) AND
    kcu.constraint_schema = rc.constraint_schema AND
    kcu.constraint_name = rc.constraint_name
WHERE rc.constraint_schema = database() AND kcu.table_schema = database()
AND rc.table_name = 'users' AND kcu.table_name = 'users'
Это нормально?
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

Путём научного тыка добился работы редиректа. Теперь функция проверки выглядит вот так:

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

    public function validateLogin3()
    {
        $host = 'localhost'; // адрес сервера 
        $database = 'XXXXXX_users'; // имя базы данных
        $user = 'XXXX'; // имя пользователя
        $password = 'XXXX'; // пароль

        $link = mysqli_connect($host, $user, $password, $database) or die('Ошибка ' . mysqli_error($link));

        $query ='SELECT * FROM `users` WHERE `login`=\''.$this->name.'\'';
        $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
        mysqli_close($link);

        if($result->num_rows == 1)
        {
            //если идентификатор найден - вернуть истину
            return true;
        }

        return false;
    }
Обратите внимание, что тут используются только базовый функционал PHP. Зато редирект работает отлично. Получается, что-то где-то подвисает при использовании ActiveRecord и не даёт сделать редирект после обращения в базу данных. Кто-нибудь может подсказать, в чём тут может быть дело?

Конфиг сервера:
Open Server 5.2.2
Apache-PHP-7-x64
PHP-7.0-x64
MySQL-5.6-x64
Redis-3.2-x64.
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после обращения в базу данных

Сообщение Maxim Glushko »

В php.ini включите показ ошибок.

Вместо отдельного validateLogin() добавьте в модель правило валидации для логина:

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

public function rules()
{
	return [
		...
		[['login'], 'unique'],
		...
	];
}
P.S. Пардон, запутался. Я дал код для валидации нового логина, а не для проверки существующей регистрации.
В любом случае включите показ ошибок.
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

Maxim Glushko писал(а): 2017.05.26, 16:51 Вместо отдельного validateLogin() добавьте в модель правило валидации для логина:
Не совсем понял. У меня авторизация - и мне нужно проверить, есть ли пользователь с таким логином в базе данных. Если строка с таким логином есть - пользователь существует. В примерах сходный код используется в методе findByUsername интерфейса \yii\web\IdentityInterface. Просто я вынес этот код в отдельную функцию, так как предполагал, что неправильно обращаюсь к классу User. При чём здесь проверка на уникальность значения?

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

    /**
     * Получить идентификационную запись по имени пользователя (логину).
     *
     * @param string $username имя пользователя (логин)
     * @return static|null
     */
    public static function findByUsername($username)
    {
        return static::findOne(['login' => $username]);
    }
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после обращения в базу данных

Сообщение Maxim Glushko »

if (User::findOne(['login' => $this->name]))

или

if (User::findOne(['login' => $this->login]))

или

if (User::findOne(['login' => $this->username]))

?
Последний раз редактировалось Maxim Glushko 2017.05.26, 17:14, всего редактировалось 1 раз.
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

Maxim Glushko писал(а): 2017.05.26, 16:51 В любом случае включите показ ошибок.
А где это включается? И где смотреть ошибки? Я сейчас смотрю трассировку через панель отладки Yii.
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

Maxim Glushko писал(а): 2017.05.26, 17:12 if (User::findOne(['login' => $this->name]))

или

if (User::findOne(['login' => $this->login]))

или

if (User::findOne(['login' => $this->username]))

?
Свойства модели формы, из которой запускается метод validateLogin():

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

    // имя пользователя
    public $name;
    // пароль
    public $password;
Связаны с полями на форме.
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после обращения в базу данных

Сообщение Maxim Glushko »

в файле php.ini
(их может быть несколько - ваша задача найти нужный на вашей системе)
изменить код error_reporting на:

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после обращения в базу данных

Сообщение MOP3E »

содержимое php.ini:

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

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = On
display_startup_errors = On
log_errors = On
Сейчас выяснил, что зависание редиректа происходит не из-за работы с базой данных, а именно после обращения из функции модели обработки фрмы к функции любой другой модели (не важно - статической или динамической).
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после вызова метода другой модели

Сообщение Maxim Glushko »

error_reporting = E_ALL
всё
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после вызова метода другой модели

Сообщение MOP3E »

Сделал. Ничего не изменилось. А куда эти ошибки должны выводиться?
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после вызова метода другой модели

Сообщение MOP3E »

Нашёл, где выводятся ошибки. Но там ничего нет...
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после вызова метода другой модели

Сообщение Maxim Glushko »

На экран в браузере.
В конфиге yii тоже нужно включить ошибки (режим разработчика).

Изображение
MOP3E
Сообщения: 12
Зарегистрирован: 2017.05.26, 12:35

Re: Не работает редирект после вызова метода другой модели

Сообщение MOP3E »

Это всё у меня прекрасно выводится и отображается. Неработающий редирект не генерирует ошибку. Я проследил работу функции редиректа в случае его выполнения и невыполнения. В обоих случаях одна и та же переменная в ядре Yii инициализируется адресом, на который нужно выполнить переход. Но, если перед вызовом редиректа из одной модели обратиться к данным или функции другой модели - редирект не происходит, хотя переменная всё равно инициализируется.

В чём здесь вообще может быть дело?
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после вызова метода другой модели

Сообщение Maxim Glushko »

Редирект из модели происходит или из контроллера?
Аватара пользователя
Maxim Glushko
Сообщения: 98
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

Re: Не работает редирект после вызова метода другой модели

Сообщение Maxim Glushko »

Это у вас не редиректит?

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

$this->redirect(['user/index']);
Что у вас в UserController::actionIndex?
Внутри можете вставить echo 'я здесь!'; exit(); ?
Ответить