在laravel中拯救雄辩的构造函数

时间:2014-09-27 13:16:29

标签: php laravel eloquent

所以,我目前正在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();
}   

}

2 个答案:

答案 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();

这对我来说更有意义。