Как проверить наличие своей валидации (custom validation)?

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

Как проверить наличие своей валидации (custom validation)?

Сообщение rkk » 2018.08.27, 14:53

Доброго дня всем.

Предыстория:
Есть проект, который развивается, по оказанию услуг (их много планируется несколько сотен).
Поля на услугах схожие, но есть дополнительные и у некоторых есть различия.
Делать модель под каждую услугу неразумно, использую общую модель. Настойки услуги храню в базе. Дополнительные поля с настройками, валидациями и т.д. тоже в базе. Настройки валидации хранятся в таком виде «["0"=>["0"=>'my_input', "1"=>'validateMyField',],"1"=>["0"=>'my_input', "1"=>'required',]]»
Сама функция валидации в модели.

Вопрос:
rules формируется, приблизительно, в такой вид.

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

    public function rules()
    {
        return [
...
            ['my_input', 'validateMyField'],
            ['my_input', 'required'],
        ];
    }

	public function validateMyField($attribute, $params)
	{
		echo '111';
		exit;
	}
Если функции не будет

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

//	public function validateMyField($attribute, $params)
//	{
//		echo '111';
//		exit;
//	}
или допустят ошибку в имени. Вывалится такая ошибка.
ReflectionException
Class validateMyField does not exist

Администратор конечно увидит, что что-то не так и поправит это, но хочется сделать все по человечески, чтобы даже не специалист понял в чем проблема.

Есть ли возможность в yii проверить наличие своей валидации validateMyField, перед её подключением?
Проверить существования класса не вариант, validateMyField — это можетбыть свойством.
Может кто-то делал подобное поделитесь опытом.

Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как проверить наличие своей валидации (custom validation)?

Сообщение futbolim » 2018.08.27, 20:01

Для этого существуют сценарии в модели

uEhlO4a
Сообщения: 68
Зарегистрирован: 2017.08.12, 19:19

Re: Как проверить наличие своей валидации (custom validation)?

Сообщение uEhlO4a » 2018.08.27, 22:16

1. https://www.yiiframework.com/doc/api/2. ... namicmodel
2. делаешь свое поведение на BEFORE_VALIDATE

Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как проверить наличие своей валидации (custom validation)?

Сообщение futbolim » 2018.08.28, 00:18

uEhlO4a писал(а):
2018.08.27, 22:16
1. https://www.yiiframework.com/doc/api/2. ... namicmodel
2. делаешь свое поведение на BEFORE_VALIDATE
Не советую так делать.
Динамические модели удобны при "малых валидациях". Автор же ясно объяснил, что логика большая. Они утолщают контроллеры и запутывают код больше, чем обычные модели.

rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

Re: Как проверить наличие своей валидации (custom validation)?

Сообщение rkk » 2018.08.28, 12:14

Спасибо, но сценарии не подходит.
Если поле добавлено к услуге, оно автоматически попадает в сценарий.

Я же хотел упростить себе работу, чтобы меня не дергали каждый раз, добавь новое поле.

Администраторы сами могут создавать поля, заводить их в базе. А в свойство rules добавлять свои правила в виде строки «["0"=>["0"=>'my_input', "1"=>'validateMyField',],"1"=>["0"=>'my_input', "1"=>'required',]]»
При сохранении я проверяю является ли строка представлением массива и сохраняю.
При вызове модели добавляю эти правила к массиву свойства rules.

Согласен тут много узких мест, можно ошибиться с именем поля, с именем валидации. Не кидайте камнями, мол можно и функцию запихнуть туда. По хорошему написать конструктор.
Задача пока стоит максимально быстро дать возможность админам создать поля.

uEhlO4a
Сообщения: 68
Зарегистрирован: 2017.08.12, 19:19

Re: Как проверить наличие своей валидации (custom validation)?

Сообщение uEhlO4a » 2018.08.28, 13:13

ясно. я такое делал недавно, наверно что-то похоже

public function rules()
{
$customFields = static::getCustomFields();
$customFieldsRules = $customFields ? [[$customFields, 'string', 'max' => 255], [$customFields, 'default', 'value' => null]] : [];

return array_merge([....], $customFieldsRules);
}

public static function getCustomFields()
{
$allColumns = \Yii::$app->getDb()->getSchema()->getTableSchema(static::tableName())->getColumnNames();
$usedCustomNames = [];
foreach ($allColumns as $name) {
if (mb_strpos($name, CUSTOM_FIELD_PREFIX) === 0) {
$usedCustomNames[] = $name;
}
}

return $usedCustomNames;
}

uEhlO4a
Сообщения: 68
Зарегистрирован: 2017.08.12, 19:19

Re: Как проверить наличие своей валидации (custom validation)?

Сообщение uEhlO4a » 2018.08.28, 13:29

futbolim,
в смысле при малых валидациях? Суть динамической модели именно в том, что она динамическая.
Всё что нужно сделать - это еще одну обертку типа фабрики, которая будет добавлять нужные поля и правила.

Ответить