2014-09-27 7 views
0

그래서 저는 현재 Laravel의 브라우저 게임을 만들고 있습니다. 지금까지는 프레임 워크를 좋아하지만 경험이별로 없으며이 기능을 사용할 수 없습니다.laravel의 멋진 생성자에서 저장

기본적으로 나는 모든 사용자가 instantieted 될 때마다 업데이트하고 있는데, 사용하지 않을 때 업데이트 할 이유가 없기 때문입니다. 그러나 생성자에서이 함수를 호출하면 사용자가 업데이트되지 않고 생성자 외부에서 함수를 호출 할 때만 작동합니다.

내가 놓친 적이 있습니까?

미리 감사드립니다.

<?php 
class User extends Eloquent implements UserInterface, RemindableInterface { 

use UserTrait, RemindableTrait; 

/** 
* The database table used by the model. 
* 
* @var string 
*/ 
protected $table = 'users'; 

/** 
* The attributes excluded from the model's JSON form. 
* 
* @var array 
*/ 
protected $hidden = array('password', 'remember_token'); 


public function __construct($arguments = array()) 
{ 
    parent::__construct($arguments); 

    $this->updateHp(); 
} 


public function updateHp() 
{ 
    $this->hp_last = time(); 
    $this->save(); 
} 

} 

답변

2

Eloquent는 정적 클래스이며 쿼리에서 데이터를 가져오고 (find, first, get) 모델을 만들 때 빈 모델 만 있고 데이터가 없습니다. 예를 들어 사용할 수있는 데이터가있는 지점은 다음과 같습니다.

public static function find($id, $columns = array('*')) 
{ 
    if (is_array($id) && empty($id)) return new Collection; 

    $instance = new static; 

    return $instance->newQuery()->find($id, $columns); 
} 

이러한 쿼리 방법 중 하나를 사용하기 전에 사용자는 무효화됩니다.

그래서 모델이 여전히 공백 (모두 null)이기 때문에 __construct 중에는 그렇게 할 수 없습니다.()는 것이다 모델을

public static function boot() 
{ 
    static::creating(function($user) 
    { 
     $user->updateHp($user); 
    }); 

    static::updating(function($user) 
    { 
     $user->updateHp($user); 
    }); 

    parent::boot(); 
} 

public function updateHp() 
{ 
    $this->hp_last = time(); 

    $this->save(); 
} 

그런 다음, 때마다 저장 : 부팅시,

우선 몇 가지 만들고 업데이트 청취자를 만들 : 이것은 당신이 그것을 어떻게 든, 자동으로 만들기 위해 무엇을 할 수 저장하기 전에 방법을 실행하십시오.

$user = User::where('email', '[email protected]')->first(); 

$user->activation_code = Uuid::uuid4(); 

$user->save(); 

모든 사용자에 대해 자동으로 수행하려면 다음과 같이하십시오. 로그인 이벤트에 연결할 수 있습니다. 당신의 global.php 파일에이 코드를 추가합니다 : 나는 알고있다

if ($user = Auth::attempt($credentials)) 
{ 
    Event::fire('user.logged.in', array($user)); 
} 
+0

그러나 먼저 부모 생성자에서 페치 된 것은 아닌가? – TrickyInt

+0

Eloquent는 정적 클래스이며 데이터를 쿼리 (find, first, get)에서 가져오고 모델을 만들 때 빈 모델 만 있고 데이터가 없습니다. –

+0

모델을 만드는 예제를 보여주기 위해 편집되었습니다. –

0

제 생각에는 그렇게해서는 안됩니다. 코드를 사용하는 경우 :

$user = new User(); 

당신이 실행하려는 :

$this->hp_last = time(); 
$this->save(); 

이 경우 정확히 무슨 일이 일어날해야을? id가없는 새 사용자는 속성 hp_last으로 생성해야합니까?

나는 그것이 최선의 방법이 아니라고 생각합니다.

그런 다음 사용할 수있는 기능에두고해야

$user = new User(); 
$user->find(1); 
$user->updateHp(); 

나를 위해 훨씬 더 의미가있다.

+0

:에

Event::listen('user.logged.in', function($user) { $user->updateHp(); }) 

그런 다음 로그인 방법에 당신이해야합니다. 또한 함수에서 hp_last가 1 이상인지 여부를 확인하여 새로운 사용자인지 아닌지 확인합니다. 그러나 항상 함수를 호출하는 것은 짜증나는 일입니다. 생성자에서이 작업을 수행 할 수 있습니까? – TrickyInt