Laravel - 在创建和更新时将ip发送到数据库

时间:2013-11-18 05:01:57

标签: php laravel

所以我在两个事件发生时尝试发送用户的IP地址

  • 为用户创建帐户时
  • 每当用户请求页面时,请求检查ip是否相同,如果不是,请更新

所以我知道如何更新并获取IP地址,但是,我不想复制和粘贴两段代码两次以获得相同的结果....所以我问的是,如何一旦用户加载网站,我可以获取IP,将其存储在全局(?)变量中,然后在我需要的任何地方使用该变量,例如,当用户创建帐户时,以及过滤器检查是否ip是否相同。

因为我试图将它添加到我的HomeController构造函数中,但UserController无法找到变量,我可能知道原因。所以这是代码。

UserController我需要它:

    public function createUser()
    {

        $newUser = new User;
        $newUser->username = $username;
        // get ip address
        $newUser->ip_address = $userIpAddress;
        $newUser->save();

        if (!Auth::check()) {
            Auth::login($newUser);
        } else {
            return View::make('home');
        }
        return Redirect::action('HomeController@showHome');
    }

过滤我检查它是否不同的地方

Route::filter('checkUserFilter', function() 
{
    $userIpAddress = Request::getClientIp();

    if (Auth::guest()){
        return Redirect::action('UserController@createUser');
    }  else {

        $user = Auth::user();
        return View::make('home', 
                [   'user'          => $user,
                    'userName'      => $user->username, 
                    'userId'        => $user->id, 
                    'userPass'      => $user->password
                ]
        );
    }

});

1 个答案:

答案 0 :(得分:1)

Eloquent发射多个事件,你可以听取它们 你想要的是听每次创建或更新模型(保存到数据库)时触发的saving事件。
这是你如何做到这一点。

Eloquent尝试保存模型并触发saving事件。由于您收听此事件,因此您将获得当时正在保存的模型实例作为函数参数。现在您可以在那里设置IP地址(或任何其他属性)

// app/models/User.php

class User extends Eloquent
{
    /**
     * Listen for save event
     */
    protected static function boot()
    {
        parent::boot();

        static::saving(function($model)
        {
            $model->ip = \Request::getClientIp();
        });
    }
}

现在,路线过滤器 由于您在事件侦听器中自动设置了属性,因此调用update方法就足够了。

Route::filter('checkUserFilter', function() 
{
    if (Auth::guest()) {
        // ...
    }  else {

        $user = Auth::user();
        $user->ip = Request::getClientIp();
        $user->update();

        // ...
    }

});