我对Laravel 4.2的事件有疑问...... 我目前在" auth.login"上有一个事件监听器...当用户登录web版本时会执行一些代码行...但是如果用户通过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"我自己用参数手动触发它会使事件双重激发(我认为?)
有没有办法检测事件在事件中被触发的位置:监听并且不要插入"登录尝试" (我在事件监听器中的代码)每次在我的API中使用getRefreshData()函数?是的,我需要在API函数中记录用户(对于其他不包含的代码)
答案 0 :(得分:0)
编辑:在我看来,最直接的处理方法是检查事件监听器中的令牌。
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
对象。
如果您有任何其他问题,请与我们联系!
答案 1 :(得分:0)
来自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();
}
}