Проверяйте электронную почту по двум таблицам с помощью специального валидатора в CakePHP 3.x

Мне нужно убедиться, что поле электронной почты уникально для текущей таблицы контактов, и я хочу убедиться, что это же письмо уникально и для таблицы пользователей. Если он не найден ни в одной из таблиц, разрешите сохранение данных.

Я не уверен, что получаю данные наилучшим образом. Это единственный способ, который я нашел для работы.

Кроме того, я могу заставить пользовательскую проверку работать, и она вернет false, если электронная почта существует, и true, если электронная почта не существует, но все равно сохраняет данные. Не уверен, как сказать, чтобы не сохранять данные, если электронная почта была найдена.

Вот моя модель таблицы контактов в настоящее время:

<?php
namespace App\Model\Table;

use App\Model\Entity\Contact;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
use Cake\Validation\Validator;

/**
 * Contacts Model
 */
class ContactsTable extends Table
{

    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        $this->table('contacts');
        $this->displayField('first_name');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator
            ->allowEmpty('id', 'create');

        $validator
            ->add('email', [
                'validateEmail' => [
                    'rule' => 'validateEmail',
                    'provider' => 'table',
                    'message' => 'That email already exists'
                    ]
                ])
            ->requirePresence('email', 'create')
            ->notEmpty('email');

        return $validator;
    }

    //check that the email is unique in both the Contacts table and in the Users table
    public function validateEmail($value, $context) {
        $usersTable = TableRegistry::get('Users');
        $contactsTable = TableRegistry::get('Contacts');
        if ( $contactsTable->exists(['email' => $value]) || $usersTable->exists(['email' => $value]) ) {
            return false;
        } else {
            return true;
        }
    }
}

1 ответ

Когда я впервые начал это дело, я не мог понять, как получить данные из таблицы, но я заставил его работать, используя метод из моего OP.

Однако я не думаю, что это лучший способ сделать это. Если у кого-то есть лучший способ, дайте мне знать.

Приведенный выше код работает с точки зрения проверки 2 таблиц на наличие уникального электронного письма.

Я также понял, как отобразить сообщение. Когда я сохранял данные, я переопределял объект $contact, используя этот код:

if ($contact = $this->Contacts->save($contact)) {
    //code to execute
}

Однажды я изменил это на:

$new_contact = $this->Contacts->save($contact)

Это начало работать.

Другие вопросы по тегам