2015-11-29 3 views
1

У меня есть вопрос относительно событий с Laravel 4.2 ... В настоящее время у меня есть прослушиватель событий на «auth.login» ... некоторые строки кода выполняются при входе пользователя в веб-версию ... однако я хотел бы выполнить другое действие, если пользователь зарегистрировался через контроллер API, например: ApiController @ postLogin (моя мобильная версия).L4.2 Событие: знаете, откуда произошло увольнение?

код в моем родном контроллере:

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('[email protected]')->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» самостоятельно .. стрельба вручную с параметром просто сработала бы дважды (я думаю?)

Есть ли способ определить, откуда произошло событие в событии: прослушать и не вставлять «вход в систему attemp» (мой код в прослушивателе событий) каждый раз, когда я использую функцию getRefreshData() в моем API? Да, мне нужно зарегистрировать пользователя в моей функции API (для другого кода, который не включен)

ответ

0

После некоторых исследований я обнаружил, как я мог шунтирование выполнения слушателя событий, когда событие вызываются из ApiController, используя Request :: есть() функции

От L4.2 Docs: 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(); 
    } 
} 
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' => '[email protected]', 'mobile' => true)); 

Затем вы можете установить эти параметры к объекту $event, который передается вашему слушателю.

Дайте мне знать, если у вас есть дополнительные вопросы!

+0

Я добавил код и точность ... Если I Event :: fire ('auth.login') вручную, я просто запустил бы это событие дважды? Laravel автоматически включит auth.логин после Auth: attemp или Auth: login ($ user), но я не хочу, чтобы прослушиватель событий выполнялся с APIController – raphjutras

+0

Ок, см. мое редактирование, сообщите мне, если он работает! –

+0

После нескольких исследований я наконец нашел более четкий способ сделать это ^^ Я сам ответил на мой пост Спасибо за вашу помощь @ Josh Rumbut – raphjutras

Смежные вопросы