2016-04-05 7 views
1

Nun, der Titel sagt alles. Ich habe ein Login-Formular, das funktioniert. Aber ich muss den Zeitstempel speichern, wenn sich der Benutzer zusätzlich zu einem Feld, das den Zeitstempel speichert, wenn der Datenbankeintrag geändert wird, erfolgreich anmeldet. Das sind also zwei verschiedene Bereiche. Ich habe diese Antwort here gefunden, die tut, was ich will. Leider ist die Klasse ContainerAware in Symfony3 nicht vorhanden, so dass ich nicht weiß, wie ich eine EntityManager-Instanz in meinen Handler bekommen kann. Ich bin mir ziemlich sicher, dass es eine einfache Lösung gibt, aber ich kann sie einfach nicht finden.Symfony3 Login speichern Zeitstempel in Datenbank nach Authentifizierungserfolg

Mit Hilfe des Hinweises von @micguo bin ich einen Schritt weiter gekommen. Hier ist mein Code so weit:

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\DependencyInjection\ContainerAwareTrait; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class AuthenticationHandler implements AuthenticationSuccessHandlerInterface{ 

use ContainerAwareTrait; 

/** 
* {@inheritDoc} 
* @see \Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface::onAuthenticationSuccess() 
*/ 
public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 
    $token->getUser()->setAnmeldat(new \DateTime("now")); 
    $this->container->get('doctrine')->getEntityManager()->flush(); 

    return new RedirectResponse($this->container->get('router')->generate('/auth/bnme')); 
} 

} 

Aber wenn ich versuche, um sich einzuloggen, wirft Symfony eine Ausnahme: Fehler: Rufen Sie auf eine Elementfunktion get() auf einem Nicht-Objekt. Was ist hier falsch?

+0

aber was ist die Frage? Um den Timestamp-Wert bei der Anmeldung zu speichern? Bearbeiten Sie einfach die Entität und erstellen Sie die Tabelle neu, so dass sie ihr Feld hat und füllen Sie sie bei der Anmeldung ... Was ist eine Komplikation hier? – Farside

+0

Ich muss dafür zwei verschiedene Datenbankfelder verwenden. Ein Feld für Änderungen auf dem Datensatz und ein anderes für den Login-Zeitstempel – Raistlin

+0

Raistlin, gute Eingabe, nur diese zusätzliche Informationen zu der Frage selbst, genauer gesagt. Vielen Dank. – Farside

Antwort

2

Verwenden Sie die ContainerAwareTrait statt


ContainerAwareTrait nutzen zu können, müssen Sie eine Definition in Ihrer services.yml Datei machen.

Create Service implementing ContainerAwareInterface

+0

Vielen Dank für den Hinweis. Ich habe es versucht, aber dann eine Ausnahme: Fehler: Aufruf an eine Member-Funktion get() auf einem Nicht-Objekt. Ich werde den Code in meiner Frage oben veröffentlichen – Raistlin