Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте. Помогите мне советом, пожалуйста.
Есть в базе список категорий. Эти категории выводятся пользователю в виде списка checkbox-ов. Пользователь может выбрать несколько категорий и его выбор запишется в БД. С этим всё просто.
Возник вопрос: а если злоумышленник подменит значения этих checkbox и в базу запишутся несуществующие значения? Из этого вопроса вытекает следующий:
Как можно провести проверку (валидацию) массива выбранных с помощью checkbox значений на наличие их в базе?
Не в сети
Здравствуйте. Помогите мне советом, пожалуйста.
Есть в базе список категорий. Эти категории выводятся пользователю в виде списка checkbox-ов. Пользователь может выбрать несколько категорий и его выбор запишется в БД. С этим всё просто.
Возник вопрос: а если злоумышленник подменит значения этих checkbox и в базу запишутся несуществующие значения? Из этого вопроса вытекает следующий:
Как можно провести проверку (валидацию) массива выбранных с помощью checkbox значений на наличие их в базе?
Приведите пример (в Вашем понимании):
1) правильно
2) не правильно
И, как вариант, что Вам мешает проводить свою валидацию (проверку) на сравнение - есть сие в базе или нет?
Изменено HunterNomad (31.01.2015 12:41:06)
Не в сети
Приведите пример (в Вашем понимании):
1) правильно
2) не правильно
Не понял Вас. Я просто хотел как-нибудь с помощью класса Validator сделать, чтобы было примерно так:
# Правила проверки
$rules = array(
'categories' => 'array|exists:categories,id'
);
# Это выделенные категории
$input = array('
'categories' => array(1,2,3,4,5,6,7)
');
Т.е. если мы указали "array", то все значения из массива проверились на наличие в таблице categories.
Не в сети
Проблема решена. Оказывается не меня одного такая задумка беспокоила . На одном америкосском форуме нашел ответ.
Рассказываю, как сделал - вдруг кому-то понадобится.
Итак, мы хотим, чтобы полученные от пользователя в виде массива значения выделенных checkbox проверились на наличие их в базе данных. Для этого нам нужно расширить класс Validator, добавив свои правила проверки. Вот код класса, расширяющего функционал стандартного Validator'а:
class CustomValidator extends Illuminate\Validation\Validator {
public function validateEach($attribute, $value, $parameters)
{
// Transform the each rule
// For example, `each:exists,users,name` becomes `exists:users,name`
$ruleName = array_shift($parameters);
$rule = $ruleName . (count($parameters) > 0 ? ':' . implode(',', $parameters) : '');
foreach ($value as $arrayKey => $arrayValue)
{
$this->validate($attribute . '.' . $arrayKey, $rule);
}
// Always return true, since the errors occur for individual elements.
return true;
}
protected function getAttribute($attribute)
{
// Get the second to last segment in singular form for arrays.
// For example, `group.names.0` becomes `name`.
if (str_contains($attribute, '.'))
{
$segments = explode('.', $attribute);
$attribute = str_singular($segments[count($segments) - 2]);
}
return parent::getAttribute($attribute);
}
}
Хорошо, код у нас есть. Теперь его нужно куда-то поместить. Я для этого создал в папке app/ папку extensions/ и поместил туда файл (название файла CustomValidator.php) с кодом нашего проверяльщика.
Затем в файл composer.json в блок "autoload" -> "classmap" добавил такую строку:
"app/extensions"
Затем в терминале (консоли) выполнил следующую команду:
composer dump-autoload
чтобы наш класс проверяльщика зарегистрировался.
Затем в файл app/start/global.php поместил такой код:
/**
*
* @var Регистрируем расширение валидатора
*
*/
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new CustomValidator($translator, $data, $rules, $messages);
});
Вот и всё. Глаза бояться, а руки делают .
И самое интересное - как пользоваться. Нужно для проверки создать такое правило:
"required|array|each:exists,имя_таблицы,имя_поля"
Т.е. работаем практически так же, как и с обычным правилом exists, только в данном случае после exists не ставим двоеточие, а через запятую перечисляем, в какой таблице и в каком проверить на наличие.
Не в сети
Вот я заморочился с этой проверкой. Нужно было сразу проверить существующие правила проверки. Оказывается никаких расширений для класса Validator не нужно. Правило exists отлично справляется и с массивами. Даже с многомерными.
Пишу на всякий случай, вдруг кто-то с таким же столкнётся...
P.S. Версия Laravel 4.2
Не в сети
Страницы 1