2016-08-23 6 views
3

Я пытаюсь сделать систему (в Zend Framework 2) для проверки электронной почты пользователя, отправив электронное письмо со ссылкой с токеном (например: http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9), поэтому, если найден токен в базе данных предварительно зарегистрированная учетная запись переходит в состояние VERIFIED.Проверка маркера электронной почты Zend Framework 2

Я использую маршрут в module.config.php так:

'verify' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/user/autenticate/verify/:token', 
       'defaults' => array(
        '__NAMESPACE__' => 'User\Controller', 
        'controller' => 'Autenticate', 
        'action'  => 'verify', 
       ), 
        'constraints' => array(
        'token' => '[a-zA-Z0-9]{30}' 
       ), 
      ), 
     ), 

затем в AutenticateController.php, следующий метод действия:

public function verifyAction() 
{ 
    sleep(3); // Delay against brute attack (is it useful?) 
    $token = $this->params()->fromRoute('token'); 
    $registerverification = new RegisterVerification(); 

    try { 
     $registerverification = $this->getRegisterVerificationTable()->getRegisterVerification($token); 

     // If arrives here (no exception) means that the token was in the database 
     $aux = $this->getRegisterVerificationTable()->deleteRegisterVerification($token); 
     $user = new User(); 
     $user = $this->getUserTable()->getUser((int)$registerverification->id); 
     $user->verified = date("Y-m-d H:i:s"); 
     $this->getUserTable()->saveUser($user); 

     $this->flashMessenger()->addMessage("Now your account is active"); 
    } catch (\Exception $e) { // Could not find row: $token 

     $this->flashMessenger()->addMessage($e->getMessage()); 
    } 
    return array(); 
} 

И verify.phtml, как это :

<?php 
echo $this->flashMessenger()->render(); 
?> 

Это работает, но не с первой попытки, но только после обновления URL-адреса (http://example.com/user/autenticate/verify/abG12Fdss67j3kgfdds4jdpa74FiP9).

Может ли кто-нибудь помочь мне в том, что мне нужно сделать, чтобы метод verifyAction() для AutenticateController.php выполнялся при первом вызове URL-адреса?

ответ

2

Флэш-мессенджер предназначен для отображения сообщений в запросе следующего, поэтому вы, вероятно, захотите перенаправить на другой URL-адрес после добавления сообщения об успешном завершении. Это может быть единственной проблемой (в противном случае сообщите нам, что происходит по первому запросу).

+0

Wonderful @Tim! Я создал новый checkanswerAction (с его видом и его маршрут) и просто добавил _return $ this-> redirect() -> toRoute ('verifyanswer'); _ и конец verifyAction вместо предыдущего _return array(); _ и он отлично работает. –

+0

Кстати @Tim (я не знаю, могу ли я спросить об этом здесь), считаете ли вы, что полезно использовать инструкцию _sleep (3); _ в начале verifyAction() против бота, пытающегося использовать токены? –

+0

Возможно, вы захотите переместить сон в ваш catch {} (так что только люди, подающие недействительные токены, наказываются). –