Используя symfony с ORM Doctrine, возникла необходимость проверки e-mail'a в форме, но обычного sfValidatorEmail не достаточно, т.к. если в модели данных Doctrine поле email объявлено с валидатором «email: true» оно проверяется самой Doctrine на наличие MX-записи домена и если ее нет — выбрасывает эксепшн. Согласитесь, это не красиво(: Пользователь вводит регистрационные данные и фейковый почтовый адрес, удовлетворяющий шаблону, и получает в ответ «500 Inernal Server Error».
Для корректной обработки фейковых адресов я сделал свой валидатор sfValidatorEmailMx, который наследует стандартный валидатор sfValidatorEmail добавляя проверку MX-записи домена, если записей нет — вызыдает ошибку «mx_error» и именем домена в поле %domain%.
Код валидатора (lib/validator/sfValidatorEmailMx.class.php):
Использование:
Буду рад, если кому-нибудь пригодится(:
Для корректной обработки фейковых адресов я сделал свой валидатор sfValidatorEmailMx, который наследует стандартный валидатор sfValidatorEmail добавляя проверку MX-записи домена, если записей нет — вызыдает ошибку «mx_error» и именем домена в поле %domain%.
Код валидатора (lib/validator/sfValidatorEmailMx.class.php):
- <?php
-
- /**
- * sfValidatorEmailMx validates emails width mx record.
- *
- * @package symfony
- * @subpackage validator
- * @author Rustam Miniakhmetov <pycmam[at]gmail.com>
- */
- class sfValidatorEmailMx extends sfValidatorEmail
- {
- /**
- * @see sfValidatorEmail
- */
- protected function configure($options = array(), $messages = array())
- {
- parent::configure($options, $messages);
- $this->addMessage('mx_error', 'No MX records for domain %domain%.');
- }
-
- protected function doClean($value)
- {
- $value = parent::doClean($value);
-
- list(,$domain) = explode('@', $value);
-
- if ($this->checkMx($domain))
- {
- return $value;
- }
- else
- {
- throw new sfValidatorError($this, 'mx_error', array('domain' => $domain));
- }
- }
-
- protected function checkMx($domain)
- {
- if (function_exists('checkdnsrr'))
- {
- return (bool)checkdnsrr($domain, 'MX');
- }
- else
- {
- return true;
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
Использование:
- <?php
-
- //...
-
- $this->validatorSchema['mail'] = new sfValidatorEmailMx(array(),array(
- 'invalid' => 'E-Mail введен не корректно.',
- 'max_length' => 'Максимальная длина e-mail %max_length% символов.',
- 'mx_error' => 'На сервере %domain% почты быть не может.',
- ));
* This source code was highlighted with Source Code Highlighter.
Буду рад, если кому-нибудь пригодится(: