2016-08-08 92 views
0

Schön dich zu treffen.symfony 3.1 registrierung email nein FOSUser

Ich entwickle mit Symfony 3.1.3 und verwende das Sicherheitssystem, das vom Framework angeboten wird, kein FOSUser weder Guard noch.

Ich habe in meinem Controller die typische Funktion Login:

public function loginAction(Request $request) 
{ 
    // This works 
    $authenticationUtils = $this->get('security.authentication_utils'); 

    // get the login error if there is one 
    $error = $authenticationUtils->getLastAuthenticationError(); 

    // last username entered by the user 
    $lastUsername = $authenticationUtils->getLastUsername(); 

    return $this->render(
     'security/loginForm_old.html.twig', 
     array(
      // last username entered by the user 
      'last_username' => $lastUsername, 
      'error'   => $error, 
     ) 
    ); 
} 

Und ich möchte, um zu überprüfen, ob der Benutzer sein Konto aktiviert hat. In der Entität User habe ich das isActive-Attribut standardmäßig auf "false" gesetzt und nur mit dem Link in die Registrierungs-E-Mail auf "true" gesetzt.

Ich habe dieses Problem ohne Ergebnisse gesucht und ich bin sicher, dass dies etwas sehr verbreitet ist, jeder möchte überprüfen, ob die E-Mail-Adresse des Benutzers gut ist.

Danke.

Antwort

2

Nehmen wir an, Sie haben eine RegistrationController.php-Klasse, in der Sie den gesamten Code speichern, der die Benutzerregistrierung verwaltet.

Erstellen Sie eine Funktion, die E-Mail an Benutzer nach der Registrierung sendet:

public function sendConfirmationEmailMessage(User $user) 
{ 

    $confirmationToken = $user->getConfirmationToken(); 
    $username = $user->getUsername(); 

    $subject = 'Account activation'; 
    $email = $user->getEmail(); 

    $renderedTemplate = $this->templating->render('AppBundle:Emails:registration.html.twig', array(
     'username' => $username, 
     'confirmationToken' => $confirmationToken 
    )); 

    $message = \Swift_Message::newInstance() 
      ->setSubject($subject) 
      ->setFrom(MAILER_FROM) 
      ->setReplyTo(MAILER_FROM) 
      ->setTo($email) 
      ->setBody($renderedTemplate, "text/html"); 

    $this->mailer->send($message); 

} 

eine Route mit der Funktion verbunden erstellen, die eine generierte Token als Argument nimmt, dann Benutzer suchen von diesem Token und aktivieren, wenn der Benutzer vorhanden sind:

/** 
* @Route("user/activate/{token}") 
*/ 
public function confirmAction(Request $request, $token) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $repository = $em->getRepository('AppBundle:User'); 

    $user = $repository->findUserByConfirmationToken($token); 

    if (!$user) 
    { 
     throw $this->createNotFoundException('We couldn\'t find an account for that confirmation token'); 
    } 

    $user->setConfirmationToken(null); 
    $user->setEnabled(true); 

    $em->persist($user); 
    $em->flush(); 

    return $this->redirectToRoute('user_registration_confirmed'); 
} 

Dann, wenn Sie eine Funktion haben, die tatsächlich die Benutzer registrieren Sie die sendConfirmationEmailMessage nennen, wie unten dargestellt:

public function registerAction(Request $request) 
{ 
    /* All the logic goes here: form validation, creating new user */ 
    /* $user is created user */ 
    sendConfirmationEmailMessage($user); 
} 

Wie auch immer, wenn die Funktion isActive() false zurückgibt Symfony Sicherheitssystem verhindert die Anmeldung. Ihre Benutzereinheit sollte UserInterface implementieren.

+0

Danke, brilliant. Du hast auf alle Zweifel geantwortet, die ich hatte. Ich habe etwas zu tun ..... :-) – Carlos