Страница 1 из 1

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

Добавлено: 2018.11.10, 21:03
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",

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

Добавлено: 2018.11.10, 21:29
urichalex
__CLASS__

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 2018.11.12, 07:20
futbolim
Уберите targetClass.

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

Добавлено: 2018.11.12, 11:45
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.
*/

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

Добавлено: 2018.11.12, 11:49
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
Хотя нет, ошибся, в Вашем варианте работает.

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

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

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

self::class
и

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

self::className()

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

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

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

self::class
и

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

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

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

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

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

self::class
и

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

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