2017-02-22 1 views
0

Symfony와 연락을하고 있는데, 이것은 내 첫 번째 앱이며 모든 환경을 이해하려고 노력하고 있습니다. 이것은 매우 간단한 질문이지만, 웹에서 오래 동안 서핑을 한 후에는 어떻게해야하는지 알지 못했습니다.Symfony 3에서 로그인 한 후 사용자 데이터 업데이트

나는 성공 또는 오류를 처리하기 위해 청취자와 매우 잘 작동하는 로그인 양식을 가지고 있지만, 모든 것이 좋지만 문제는 사용자의 최종 액세스 날짜를 업데이트하려고 할 때 발생합니다. 나는 사용자가 로그인이 updateLastLogin 메서드를 호출 할 때

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 

/** 
* @ORM\Table(name="app_users") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
*/ 
class User implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=25, unique=true) 
    */ 
    private $username; 

    /** 
    * @ORM\Column(type="string", length=64) 
    */ 
    private $password; 

    /** 
    * @ORM\Column(type="string", length=60, unique=true) 
    */ 
    private $email; 

    /** 
    * @ORM\Column(name="is_active", type="boolean") 
    */ 
    private $isActive; 

    /** 
    * @ORM\Column(name="salt", type="string", length=100) 
    */ 
    private $salt; 

    /** 
    * @ORM\Column(type="datetime", nullable=true) 
    */ 
    private $lastLogin = null; 

    /** 
    * @ORM\Column(type="datetime", nullable=true) 
    */ 
    private $createdAt = null; 

    public function __construct() 
    { 
     $this->isActive = true; 
     // may not be needed, see section on salt below 
     // $this->salt = md5(uniqid(null, true)); 
    } 

    public function getUsername() 
    { 
     return $this->username; 
    } 

    public function setSalt($salt) 
    { 
     $this->salt = $salt; 
    } 

    public function getSalt() 
    { 
     // you *may* need a real salt depending on your encoder 
     // see section on salt below 
     return null; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    public function getRoles() 
    { 
     return array('ROLE_USER'); 
    } 

    public function eraseCredentials() 
    { 
    } 

    public function isAccountNonExpired() 
    { 
     return true; 
    } 

    public function isAccountNonLocked() 
    { 
     return true; 
    } 

    public function isCredentialsNonExpired() 
    { 
     return true; 
    } 

    public function isEnabled() 
    { 
     return $this->isActive; 
    } 

    /** @see \Serializable::serialize() */ 
    public function serialize() 
    { 
     return serialize(array(
      $this->id, 
      $this->username, 
      $this->password, 
      $this->isActive, 
      $this->createdAt, 
      $this->lastLogin, 
      // see section on salt below 
      // $this->salt, 
     )); 
    } 

    /** @see \Serializable::unserialize() */ 
    public function unserialize($serialized) 
    { 
     list (
      $this->id, 
      $this->username, 
      $this->password, 
      $this->isActive, 
      $this->createdAt, 
      $this->lastLogin, 
      // see section on salt below 
      // $this->salt 
     ) = unserialize($serialized); 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set username 
    * 
    * @param string $username 
    * 
    * @return User 
    */ 
    public function setUsername($username) 
    { 
     $this->username = $username; 

     return $this; 
    } 

    /** 
    * Set password 
    * 
    * @param string $password 
    * 
    * @return User 
    */ 
    public function setPassword($password) 
    { 
     $this->password = $password; 

     return $this; 
    } 

    /** 
    * Set email 
    * 
    * @param string $email 
    * 
    * @return User 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

    /** 
    * Get email 
    * 
    * @return string 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * Set isActive 
    * 
    * @param boolean $isActive 
    * 
    * @return User 
    */ 
    public function setIsActive($isActive) 
    { 
     $this->isActive = $isActive; 

     return $this; 
    } 

    /** 
    * Get isActive 
    * 
    * @return boolean 
    */ 
    public function getIsActive() 
    { 
     return $this->isActive; 
    } 

    /** 
    * Updates last user login date 
    * 
    */ 
    public function updateLastLogin() 
    { 
     $this->lastAccess = new \DateTime("now"); 
    } 

    public function getLastLogin() 
    { 
     return $this->lastLogin->format('Y-m-d H:i:s'); 
    } 

    public function getCreatedAt() 
    { 
     return $this->createdAt->format('Y-m-d H:i:s'); 
    } 
} 

:

<?php 
namespace AppBundle\EventListener; 

use Symfony\Component\Security\Core\Event\AuthenticationEvent; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 

class LoginListener { 

    public function __construct(){ 
    } 

    public function onSuccessfulLogin(AuthenticationEvent $event) 
    { 
     $user = $event->getAuthenticationToken()->getUser(); 
     if($user instanceof AdvancedUserInterface){ 
      $user->updateLastLogin(); 
     } 
    } 

    public function onLoginError(AuthenticationEvent $event) 
    { 
     // Login error 
    } 
} 

updateLastLogin 코드에 도달을하지만 '아무튼

나는 (워드 프로세서에서 가져온)는 사용자 개체가 데이터베이스에서 업데이트되지 않습니다. 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까?

내가 Call to a member function getManager() on string 오류가 발생했습니다 자신의 솔루션으로, @mdma의 대답은 적합한 솔루션으로 저를 이끌어 사전


에 감사드립니다. 이를 해결하기 위해 난 그냥 리스너 생성자에서 EntityManager을 주입하고 데이터베이스에서 데이터를 유지하기 위해 누락 된 통화 추가 :

<?php 
namespace AppBundle\EventListener; 

use Doctrine\ORM\EntityManager; 
use Symfony\Component\Security\Core\Event\AuthenticationEvent; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 

class LoginListener { 

    protected $entityManager; 

    public function __construct(EntityManager $entityManager){ 
     $this->entityManager = $entityManager; 
    } 

    public function onSuccessfulLogin(AuthenticationEvent $event) 
    { 
     $user = $event->getAuthenticationToken()->getUser(); 
     if($user instanceof AdvancedUserInterface){ 
      $user->updateLastLogin(); 
      $this->entityManager->persist($user); 
      $this->entityManager->flush(); 
     } 
    } 

    public function onLoginError(AuthenticationEvent $event) 
    { 
     // Login error 
    } 
} 

을 그리고 services.yml 파일에 내가 인수로 추가 :

app.login_service: 
    class:  AppBundle\EventListener\LoginListener 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: kernel.event_listener, event: security.authentication.success, method: onSuccessfulLogin } 

이제 예상대로 작동합니다.

로그인 날짜를 업데이트 할 때 사용자 클래스에 오타가 있음을 유의하십시오. 존재하지 않는 변수를 사용하고있었습니다. $this->lastAccess = new \DateTime("now"); 대신

$this->lastLogin = new \DateTime("now"); 
+0

위대한 질문 좋은 설명! 왜 누군가가 이것을 부정적인 투표를했을까요? – mburakergenc

답변

4

엔티티 클래스 (개체)를 업데이트하고 있습니다. 데이터베이스에 저장하려면 doctrine manager 서비스를 사용해야합니다. 컨트롤러에서

는이 같은 수행 doc

$em = $this->getDoctrine()->getManager(); 

// tells Doctrine you want to (eventually) save the Product (no queries yet) 
$em->persist($product); 

// actually executes the queries (i.e. the INSERT query) 
$em->flush(); 

을하지만 생성자의 교리 서비스를 주입하고 이벤트에 법인을 지속 할 수 있도록 당신은 컨트롤러에 있지 않습니다.

<?php 
namespace AppBundle\EventListener; 

use Symfony\Component\Security\Core\Event\AuthenticationEvent; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 

class LoginListener { 
    protected $doctrine; 

    public function __construct($doctrine){ 
     $this->doctrine = $doctrine; 
    } 

    public function onSuccessfulLogin(AuthenticationEvent $event) 
    { 
     $user = $event->getAuthenticationToken()->getUser(); 
     if($user instanceof AdvancedUserInterface){ 
      $user->updateLastLogin(); 
      $this->doctrine->getManager()->persist($user); 
      $this->doctrine->getManager()->flush(); 
     } 
    } 

    public function onLoginError(AuthenticationEvent $event) 
    { 
     // Login error 
    } 
} 

및 서비스 정의에

:

services: 
    app.login_service: 
     class:  AppBundle\EventListener\LoginListener 
     arguments: [doctrine] 
+0

@mdma 감사합니다.하지만이 시도하고 나에게 "문자열에 getManager() 멤버 함수 호출"오류가 발생했습니다. –

+1

더 열심히 시도하십시오. 여기에 완벽한 대답이 있습니다! – LBA

+1

@LBA처럼 Alberto는 완벽한 답변이라고 생각합니다. 이 답변에 표시된대로 정확하게 코드를 입력했는지 확인하십시오. 어딘가에 오타가있는 것 같습니다. –

관련 문제