Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 31.01.2015 12:26:34

Проверка массива checkbox на наличие в БД.

Здравствуйте. Помогите мне советом, пожалуйста.
Есть в базе список категорий. Эти категории выводятся пользователю в виде списка checkbox-ов. Пользователь может выбрать несколько категорий и его выбор запишется в БД. С этим всё просто.
Возник вопрос: а если злоумышленник подменит значения этих checkbox и в базу запишутся несуществующие значения? Из этого вопроса вытекает следующий:
Как можно провести проверку (валидацию) массива выбранных с помощью checkbox значений на наличие их в базе?

Не в сети

#2 31.01.2015 12:40:40

Re: Проверка массива checkbox на наличие в БД.

Дмитрий пишет:

Здравствуйте. Помогите мне советом, пожалуйста.
Есть в базе список категорий. Эти категории выводятся пользователю в виде списка checkbox-ов. Пользователь может выбрать несколько категорий и его выбор запишется в БД. С этим всё просто.
Возник вопрос: а если злоумышленник подменит значения этих checkbox и в базу запишутся несуществующие значения? Из этого вопроса вытекает следующий:
Как можно провести проверку (валидацию) массива выбранных с помощью checkbox значений на наличие их в базе?

Приведите пример (в Вашем понимании):
1) правильно
2) не правильно

И, как вариант, что Вам мешает проводить свою валидацию (проверку) на сравнение - есть сие в базе или нет?

Изменено HunterNomad (31.01.2015 12:41:06)

Не в сети

#3 31.01.2015 12:53:13

Re: Проверка массива checkbox на наличие в БД.

HunterNomad пишет:

Приведите пример (в Вашем понимании):
1) правильно
2) не правильно

Не понял Вас. smile Я просто хотел как-нибудь с помощью класса Validator сделать, чтобы было примерно так:

# Правила проверки
$rules = array(
    'categories' => 'array|exists:categories,id'
);
# Это выделенные категории
$input = array('
    'categories' => array(1,2,3,4,5,6,7)
');

Т.е. если мы указали "array", то все значения из массива проверились на наличие в таблице categories.

Не в сети

#4 01.02.2015 09:08:22

Re: Проверка массива checkbox на наличие в БД.

Проблема решена. Оказывается не меня одного такая задумка беспокоила smile. На одном америкосском форуме нашел ответ.
Рассказываю, как сделал - вдруг кому-то понадобится.
Итак, мы хотим, чтобы полученные от пользователя в виде массива значения выделенных 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);
});

Вот и всё. Глаза бояться, а руки делают smile.
И самое интересное - как пользоваться. Нужно для проверки создать такое правило:
"required|array|each:exists,имя_таблицы,имя_поля"
Т.е. работаем практически так же, как и с обычным правилом exists, только в данном случае после exists не ставим двоеточие, а через запятую перечисляем, в какой таблице и в каком проверить на наличие.

Не в сети

#5 03.02.2015 10:02:14

Re: Проверка массива checkbox на наличие в БД.

Вот я заморочился с этой проверкой. Нужно было сразу проверить существующие правила проверки. Оказывается никаких расширений для класса Validator не нужно. Правило exists отлично справляется и с массивами. Даже с многомерными.
Пишу на всякий случай, вдруг кто-то с таким же столкнётся...
P.S. Версия Laravel 4.2

Не в сети

Подвал раздела