Как создать пользовательское правило проверки в торте 3

Я работаю над Cake 3. Я хочу создать собственное правило проверки. Я хочу проверить, равно ли поле «пароль» полю «confirm_password».

Это мой код:

 public function validationDefault(Validator $validator) {
        $validator
                ->add('id', 'valid', ['rule' => 'numeric'])
                ->allowEmpty('id', 'create')
                ->add('email', 'valid', ['rule' => 'email'])
                ->requirePresence('email', 'create')
                ->notEmpty('email')
                ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table'])
                ->requirePresence('password', 'create')
                ->notEmpty('password')
                ->notEmpty('confirm_password')
                ->add('confirm_password', 'custom', [
                    'rule' => function($value, $context) {
                        if ($value !== $context['data']['password']) {
                            return false;
                        }
                        return false;
                    },
                    'message' => 'The passwords are not equal',
        ]);

        return $validator;
    }

Когда я пытаюсь «сбой» отправить форму, код сохраняется, и я не получаю никакой ошибки.

Я прочитал http://book.cakephp.org/3.0/en/core-libraries/validation.html#custom-validation-rules, но не помогло... Кто-нибудь?

Спасибо!


person Bob    schedule 23.12.2014    source источник
comment
не для меня :P что ты сделал; точно скопировано?   -  person Bob    schedule 29.12.2014


Ответы (4)


Другой встроенный способ сравнения двух паролей с проверкой CakePHP 3 может быть:

->add('confirm_password',
    'compareWith', [
        'rule' => ['compareWith', 'password'],
        'message' => 'Passwords not equal.'
    ]
)

Вы также можете добавить это в свой метод validationDefault в определении таблицы.

person lorem monkey    schedule 26.03.2015

Хорошо, я нашел это на себе. Всем, кто застрял на моделях торта: НИКОГДА НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ ВАШИ ПОЛЯ В $_accessible-массив В ВАШЕМ СУЩЕСТВЕ!

Мой код:

    /UsersTable.php;

    $validator->add('confirm_password', 'custom', [
        'rule' => function ($value, $context) {
            return false; // Its ment to go wrong ;)
        },
        'message' => 'Password not equal',
    ]);

    /User.php;

    protected $_accessible = [
        'email'            => true,
        'password'         => true,
        'bookmarks'        => true,
        'role_id'          => true,
        'confirm_password' => true,
    ];
person Bob    schedule 29.12.2014
comment
Это неправильно. Свойство _accessible просто позволит массово присвоить заданным свойствам. Я предлагаю вам удалить принятый ответ для других пользователей, приходящих сюда. - person lorem monkey; 25.05.2016

Попробуйте этот код, он точно сработает

 $validator
     ->notEmpty('cpassword')
     ->add('cpassword', ['length' => ['rule' => ['minLength', 8],'message' => 'Password need to be at least 8 characters long',]])
     ->add('cpassword', 'passwordsEqual', [
                'rule' => function($value, $context) {
                    return isset($context['data']['cpassword']) &&
                     $context['data']['password'] === $value;      
                },
                'message' => 'The two password you typed do not match.',
        ]);
person homi    schedule 08.04.2016

person    schedule
comment
где находится метод compareWith, которого в вашем коде не хватает - person Er. Amit Joshi; 29.01.2019