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();
}
}
我有一个关于 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();
}
}