2014-02-13 1 views
8

Laravel에서이 작업을 수행 할 수 있습니다 : 그 개체의 항목에 대한 변경을 할 경우Laravel에서 사용자 개체를 "새로 고침"하는 방법?

$user = Auth::user(); 

문제가있다, 내 변경하기 전에이 무엇인지 저를 줄 것이다. 최신 값을 가져 오기 위해 개체를 새로 고치는 방법은 무엇입니까? 나는. DB에서 최신 값을 가져 오도록 강요하려면?

+2

자동으로'저장()'에 데이터베이스에 만들어 질 것입니다 변경 사항을 가지고있다. 물체를 다시 채울 필요가 없습니다. 만약 당신이 정말로 그것을 강요하고 싶다면'User :: find ($ id)'? – SamV

+0

정확하게 좋은 솔루션은 아니지만 Auth :: setUser ($ user)를 호출 할 수 있습니다. auth 사용자와 동일한 사용자 객체를 변경 한 후 대신에 다음과 같이하면됩니다 :'function refreshAuthUser() {$ id = Auth :: user() -> id; Auth :: logout(); Auth :: loginUsingId ($ id); }' – alexrussell

답변

1

Laravel 이미 당신을 위해 그것을 않습니다. 당신이 Auth::user() 할 때마다, Laravel 그것은 현재 사용자를 널링과가 기록되어있는 경우, 다시 세션에 저장된 로그인 ID를 사용하여 검색

// First we will try to load the user using the identifier in the session if 
// one exists. Otherwise we will check for a "remember me" cookie in this 
// request, and if one exists, attempt to retrieve the user using that. 
$user = null; 

if (! is_null($id)) 
{ 
    $user = $this->provider->retrieveByID($id); 
} 

않습니다.

정상적으로 작동하지 않는 경우 여기에 표시되지 않는 코드가 사용자에게 캐싱되어 있습니다.

+2

이것은 정확하지 않습니다 (최소한 4.2 이상). 위의 $ user가 null로 설정되면 Auth는 $ this-> user가 설정되어 있는지 확인한 다음 사용합니다. 데이터베이스에서 새로 고치지 않습니다. https://github.com/laravel/framework/blob/4.2/src/Illuminate/Auth/Guard.php#L130 – ryduh

+0

Laravel 5.4부터는 그렇게 작동하지 않습니다. @ Er-Mohit-Agrawal의 해결책을 사용하십시오. Auth :: setUser ($ user); \ – DvdEnde

5

Laravel이 그런 일을하지만, 동일한 요청 중에 Auth :: user()에 반영된 업데이트를 볼 수 없습니다. /Illuminate/Auth/Guard.php에서 (단지 안토니오는 그의 대답에 언급 코드 위에 위치) : 그래서

// If we have already retrieved the user for the current request we can just 
// return it back immediately. We do not want to pull the user data every 
// request into the method because that would tremendously slow an app. 
if (! is_null($this->user)) 
{ 
    return $this->user; 
} 

당신은 '새 이름'에 '옛 이름'에서 사용자 이름을 변경하려고 한 경우 :

$user = User::find(Auth::user()->id); 
$user->name = 'New Name'; 
$user->save(); 

그리고

나중에는 Auth::user()->name을 확인하여 이름을 얻는 시도 같은 요청, 그 줄 것이다 당신은 당신을 C

log::error(Auth::user()->name)); // Will be 'Old Name'

+0

어떻게 재정의할까요? – zarcel

+0

컨트롤러에서보기를 반환하는 대신 리디렉션을 반환 할 수 있습니다. –

8

'옛 이름' 이렇게 캐시 객체를 업데이트하십시오.

Auth::setUser($user); 

에 대한
$user = User::find(Auth::user()->id); 
$user->name = 'New Name'; 
$user->save(); 

Auth::setUser($user); 

log::error(Auth::user()->name)); // Will be 'NEW Name' 
1

파티에 조금 늦게, 그러나 이것은 나를 위해 일한 :

Auth::user()->update(array('name' => 'NewName')); 
2

[이 대답은 Laravel (즉 Laravel의 최신 버전에 더 적합 5)]

Auth::user()의 첫 번째 호출에서 da에서 결과를 가져옵니다. tabase에 저장하고 변수에 저장하십시오.

그러나 이후 호출시 변수에서 결과를 가져옵니다.

은 framemwork에 다음 코드에서 볼 수있다 :

public function user() 
{ 
... 
    // If we've already retrieved the user for the current request we can just 
    // return it back immediately. We do not want to fetch the user data on 
    // every call to this method because that would be tremendously slow. 
    if (! is_null($this->user)) { 
     return $this->user; 
    } 
... 
} 

지금 우리가 모델 변경, 변경 내용이 자동으로 객체에 반영 될 수 있도록합니다. 이전 값은 포함하지 않습니다. 따라서 보통 데이터베이스에서 데이터를 다시 가져올 필요가 없습니다.

그러나 데이터베이스에서 데이터를 다시 페치하는 것이 유용 할 수 있습니다 (예 : 데이터베이스가 기본값을 적용하는지 확인하거나 다른 요청에 의해 모델이 변경된 경우).과 같이이 실행에게 fresh() 방법을 수행하려면 : 개체를 수정하면

Auth::user()->fresh() 
관련 문제