L4.2 事件:知道事件是从哪里触发的?

L4.2 Event: know where event got fired from?

我有一个关于 Laravel 4.2 事件的问题... 我目前在 "auth.login" 上有一个事件侦听器...当用户登录网络版本时会执行一些代码行...但是如果用户通过 API 控制器登录,我想执行不同的操作, 例子: ApiController@postLogin (我的手机版).

我的家庭控制器中的代码:

if (Auth::attempt(['email' => Input::get('login'), 'password' =>     Input::get('password')]) OR Auth::attempt(['username' => Input::get('login'), 'password' => Input::get('password')]))
    {
        return Redirect::intended(URL::route('dashboard.index'));
    }
    else
    {
        return Redirect::action('HomeController@getIndex')->with('poplogin', true)->with('badcredentials',true)->withInput();
    }

global.php 中的代码(事件侦听器)

Event::listen('auth.login', function($user)
{
//Put Login_attemp in Database for Last activity, etc
$user->login_attemp()->create(['login_ip'=>$_SERVER['REMOTE_ADDR'],'login_time'=> date('Y-m-d H:i:s',time())]);
$user->last_logged = date('Y-m-d H:i:s',time());
$user->save();
Session::flash('justlogged',true);
//other code that I didnt include..........

});

我的 ApiController 中的代码

public function getRefreshData() {
//check the token
    $token = Input::get('token');
    $username = Input::get('username');
    $user = User::where('api_token', $token)
                ->where('username', $username)
                ->first();
    if(!$user || !$token) {
        return Response::json([
            'error' => true,
            'message' => 'Invalid Token, please re login',
            'code' => 401],
            401
        );
    }

    Auth::login($user);

    //5 last Timesheets + tslines, for pre-load at log-in in phone memory
    //Not inserting possible creation dates between, to keep phone app 100% independent
    $timesheets = $user->timesheets()->orderBy('startdate', 'DESC')->take(10)->with('tslines')->get();

    //Other code that I didnt include
    );
    return $response;

}

我自己无法控制事件的执行 "auth.login".. 使用参数手动触发它只会重复触发事件(我认为?)

有没有办法检测在 Event:listen 中触发事件的位置并且不在每次使用 getRefreshData() 函数时插入 "log-in attemp"(我在事件监听器中的代码)在我的 API?是的,我需要在我的 API 函数中记录用户(对于未包含的其他代码)

编辑:在我看来,处理此问题最直接的方法是检查事件侦听器中的令牌。

Event::listen('auth.login', function($user)
{
    if (Input::has('token') && Input::has('username')) {
        //Put Login_attemp in Database for Last activity, etc
        $user->login_attemp()->create(['login_ip'=>$_SERVER['REMOTE_ADDR'],'login_time'=> date('Y-m-d H:i:s',time())]);
        $user->last_logged = date('Y-m-d H:i:s',time());
        $user->save();
        Session::flash('justlogged',true);
        //other code that I didnt include..........
    }
});

我真的建议,从长远来看,考虑使用 Accessing the Logged In User 下的文档中演示的功能,这只会让生活更轻松。

原始回复:如果您发布更多代码可能会有所帮助,因为我觉得也许这是一个例子,如果我们缩小一点,也许会有更好的方法来处理这种情况。可能您需要多个操作、不同的侦听器等。

不过,要解决这个问题,很简单,只需通过参数传入您需要的任何其他数据即可:

$response = Event::fire('auth.login', array($user, 'source' => 'ApiController@postLogin', 'mobile' => true));

然后您可以将这些参数设置为传递给侦听器的 $event 对象。

如果您还有其他问题,请告诉我!

经过一些研究,我发现如何使用 Request::is()[=22] 在 ApiController 触发事件时 'bypass' 执行事件侦听器=]函数

来自 L4.2 文档:http://laravel.com/docs/4.2/requests#request-information )..

我的routes.php文件是这样的:

Route::controller('api/v1', 'ApiV1Controller');

在我的 global.php 中(我声明我的事件侦听器的地方)

Event::listen('auth.login', function($user)
{
    if (!Request::is('api/*'))
    {
    //Code that is always executed at firing of event, except when from my API controllers

    //Put Login_attemp in Database for Last activity, etc
    $user->login_attemp()->create(['login_ip'=>$_SERVER['REMOTE_ADDR'],'login_time'=> date('Y-m-d H:i:s',time())]);
    $user->last_logged = date('Y-m-d H:i:s',time());
    $user->save();
    }
}