Не правильно работает валидация при использовании self::class

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

Не правильно работает валидация при использовании self::class

Сообщение slo_nik »

Добрый вечер.
Недавно вернулся к тестовому сайту, который создавал пару лет назад.
Заметил такую странность, которую не могу понять.
В модели Users для username и email делаем проверку на уникальность.

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

['username', 'unique', 'targetClass' => self::class],
['email', 'unique', 'targetClass' => self::class]
Вот в таком варианте при редактировании ошибка валидации "Имя занято...", "Email зарегистрирован..."
Если вместо self::class написать self::className(), то валидация работает нормально, при редактировании не выдаёт ошибки.
В чём тогда разница?
className() phpstorm подчёркивает как deprecated, в документации рекомендуют запись ::class, но при этом проблемы с валидацией.

p.s. в composer.json

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

"php": ">7.0",
"yiisoft/yii2": "~2.0.14",
Последний раз редактировалось slo_nik 2018.11.11, 00:25, всего редактировалось 1 раз.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Не работает валидация при использовании self::class

Сообщение slo_nik »

urichalex писал(а): 2018.11.10, 21:29__CLASS__
Не понял, при чём тут это?
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Не работает валидация при использовании self::class

Сообщение urichalex »

slo_nik писал(а): 2018.11.10, 21:42
urichalex писал(а): 2018.11.10, 21:29__CLASS__
Не понял, при чём тут это?
так, к слову
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Не работает валидация при использовании self::class

Сообщение urichalex »

Что значит проблемы с валидацией? Что именно не работает? Дебжили? Что в self::class?
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Не работает валидация при использовании self::class

Сообщение slo_nik »

urichalex писал(а): 2018.11.10, 23:50 Что значит проблемы с валидацией? Что именно не работает? Дебжили? Что в self::class?
Всё вроде бы написал в вопросе....
Вот в таком варианте при редактировании ошибка валидации "Имя занято...", "Email зарегистрирован..."
Если вместо self::class написать self::className(), то валидация работает нормально, при редактировании не выдаёт ошибки.
В self::class модель, в которой и происходит валидация.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Не работает валидация при использовании self::class

Сообщение urichalex »

slo_nik писал(а): 2018.11.11, 00:24 В self::class модель, в которой и происходит валидация.
Класс или имя класса?
ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: Не правильно работает валидация при использовании self::class

Сообщение ShNURoK »

Попробуйте веместо self написать static, я так понимаю, тут нужно позднее статическое связывание.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Не работает валидация при использовании self::class

Сообщение slo_nik »

urichalex писал(а): 2018.11.11, 21:16
slo_nik писал(а): 2018.11.11, 00:24 В self::class модель, в которой и происходит валидация.
Класс или имя класса?
Имя класса, если верить документации
/**
*Returns the fully qualified name of this class.
* @return string the fully qualified name of this class.
* @deprecated since 2.0.14. On PHP >=5.5, use `::class` instead.
*/
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Не правильно работает валидация при использовании self::class

Сообщение slo_nik »

futbolim писал(а): 2018.11.12, 07:20 Уберите targetClass.
Если убрать, то понятно что будет работать. Интересно почему не правильно работает именно в варианте

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

self::class
.
ShNURoK писал(а): 2018.11.12, 06:52 Попробуйте веместо self написать static, я так понимаю, тут нужно позднее статическое связывание.
В таком варианте не проверяет на уникальность, можно добавить пользователя с таким же логином и почтой.
ShNURoK писал(а): 2018.11.12, 06:52
Хотя нет, ошибся, в Вашем варианте работает.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Не правильно работает валидация при использовании self::class

Сообщение slo_nik »

ShNURoK писал(а): 2018.11.12, 06:52
Но я так и не понял, почему надо использовать static? В чём, всё-таки, разница между

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

self::class
и

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

self::className()
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Не правильно работает валидация при использовании self::class

Сообщение urichalex »

slo_nik писал(а): 2018.11.12, 13:16 Но я так и не понял, почему надо использовать static?
Почитайте про разницу между ранним и поздним статическим вызовом
slo_nik писал(а): 2018.11.12, 13:16 В чём, всё-таки, разница между

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

self::class
и

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

self::className()
В текущем контексте дебажьте что возвращает self::class и self::className()
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Не правильно работает валидация при использовании self::class

Сообщение azz »

slo_nik писал(а): 2018.11.12, 13:16 Но я так и не понял, почему надо использовать static? В чём, всё-таки, разница между

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

self::class
и

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

self::className()
Ну а в код залезть? className возвращает результат get_called_class, которое возвращает "Имя класса, полученное с помощью позднего статического связывания", т.е. static::class
Ответить