所以,我目前正在Laravel的浏览器游戏中工作。到目前为止,我喜欢这个框架,但我并没有真正的经验,而且我无法让它发挥作用。
基本上我试图在所有用户立即更新时尝试更新,因为没有理由在不使用时更新它们。但是从构造函数调用此函数并不会更新用户,它只在我在构造函数外部调用函数时才有效。
我错过了什么,或者只是不可能?
提前致谢!
<?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();
}
}
答案 0 :(得分: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);
}
在其中一个查询方法之前,你有空。
所以你可能在__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', 'acr@antoniocarlosribeiro.com')->first();
$user->activation_code = Uuid::uuid4();
$user->save();
如果您想以某种方式为所有用户自动制作它。您可以将其挂钩到登录事件。将此代码添加到您的global.php文件中:
Event::listen('user.logged.in', function($user)
{
$user->updateHp();
})
然后在您的登录方法中,您必须:
if ($user = Auth::attempt($credentials))
{
Event::fire('user.logged.in', array($user));
}
答案 1 :(得分:0)
在我看来,你不应该这样做。如果您使用代码:
$user = new User();
你想要奔跑:
$this->hp_last = time();
$this->save();
在这种情况下究竟应该发生什么?应使用属性hp_last
创建没有ID的新用户?
我认为这不是最好的主意。
你应该把它留在函数中然后你可以使用:
$user = new User();
$user->find(1);
$user->updateHp();
这对我来说更有意义。