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

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

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

Сообщение slo_nik » 2018.11.10, 21:03

Добрый вечер.
Недавно вернулся к тестовому сайту, который создавал пару лет назад.
Заметил такую странность, которую не могу понять.
В модели 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
Сообщения: 259
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2018.11.10, 21:42

urichalex писал(а):
2018.11.10, 21:29
__CLASS__
Не понял, при чём тут это?

urichalex
Сообщения: 832
Зарегистрирован: 2015.08.07, 11:03

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

Сообщение urichalex » 2018.11.10, 23:49

slo_nik писал(а):
2018.11.10, 21:42
urichalex писал(а):
2018.11.10, 21:29
__CLASS__
Не понял, при чём тут это?
так, к слову

urichalex
Сообщения: 832
Зарегистрирован: 2015.08.07, 11:03

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

Сообщение urichalex » 2018.11.10, 23:50

Что значит проблемы с валидацией? Что именно не работает? Дебжили? Что в self::class?

slo_nik
Сообщения: 259
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2018.11.11, 00:24

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

urichalex
Сообщения: 832
Зарегистрирован: 2015.08.07, 11:03

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

Сообщение urichalex » 2018.11.11, 21:16

slo_nik писал(а):
2018.11.11, 00:24
В self::class модель, в которой и происходит валидация.
Класс или имя класса?

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

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

Сообщение ShNURoK » 2018.11.12, 06:52

Попробуйте веместо self написать static, я так понимаю, тут нужно позднее статическое связывание.

Аватара пользователя
futbolim
Сообщения: 1979
Зарегистрирован: 2012.07.08, 19:28
Откуда: Донецк

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

Сообщение futbolim » 2018.11.12, 07:20

Уберите targetClass.
Все говорят, что нужно кем-то мне становиться.
А я хотел бы остаться собой.

slo_nik
Сообщения: 259
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2018.11.12, 11:45

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
Сообщения: 259
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2018.11.12, 11:49

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
Сообщения: 259
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik » 2018.11.12, 13:16

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

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

self::class
и

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

self::className()

urichalex
Сообщения: 832
Зарегистрирован: 2015.08.07, 11:03

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

Сообщение urichalex » 2018.11.12, 13:39

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

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

self::class
и

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

self::className()
В текущем контексте дебажьте что возвращает self::class и self::className()

azz
Сообщения: 135
Зарегистрирован: 2016.07.06, 17:20

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

Сообщение azz » 2018.11.12, 14:12

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

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

self::class
и

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

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

Ответить