2016-03-07 2 views
1

Я создаю приложение, похожее на приложение чата.Проверка того, что «другие» пользователи вошли в систему/вошли в систему, используя Laravel 5

Я хочу, чтобы узнать, вошел ли пользователь в систему или нет.

То, как я это делаю, имеет поле is_logged_in в таблице users.

Однако я не уверен, как обновить эту переменную, так как я не знаю, какой метод вызывается во время logout.

Я полагаю, что это будет что-то вроде этого:

class AuthController extends Controller 
{ 
    //... 
    public function login($user) 
    { 
     $user->is_logged_in = true; 
     $user->save(); 
    } 

    public function logout($user) 
    { 
     $user->is_logged_in = false; 
     $user->save(); 
    } 

    //... 
} 

Конечно, login и logout не являются методы, которые работают, когда пользователь на самом деле входит в систему и выхода из системы, но я не уверен, куда поставить логику.

Спасибо за помощь!

ОБНОВЛЕНИЕ Это маршруты для аутентификации.

Route::get('login', 'Auth\[email protected]')->name('login'); 
Route::post('login', 'Auth\[email protected]')->name('postLogin'); 
Route::get('logout', 'Auth\[email protected]')->name('logout'); 

Route::get('register', 'Auth\[email protected]')->name('register'); 
Route::post('register', 'Auth\[email protected]')->name('postRegister'); 

EDIT Я знаю, что я могу проверить, если текущий пользователь проходит проверку подлинности с помощью:

Auth::check() 

Однако это не поможет определить, если другие пользователи вошли в систему или не

+0

Вы можете использовать Session :: набор() и Session :: получить() методы для обработки login.And наконец можно использовать метод Session :: вровень() в Laravel для выхода из системы. – CodeCanyon

+0

Я думаю, что это плохое решение по сравнению с моим, так как существует много логики в признаке аутентификации, который не запускается. Кроме того, это намного сложнее по сравнению с использованием событий! –

ответ

1
class AuthController extends Controller 
{ 
    //... 
    public function login($user) 
    { 
     // You can choose to check if the user is logged in 
     // before you authenticate the user but its not really necessary because it can cause issues 
     if(Auth::check()){ 
     // user is logged in 
     }else{ 
     if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) { 
      // The user is active, not suspended, and exists. 
     } 
     } 
    } 

    public function logout($user) 
    { 
    if(!Auth::check()){ 
     // user is logged out 
    }else{ 
     Auth::logout(); 
    } 
    } 

} 

Отредактировано

Я думаю, вы хотите знать, были на самом деле происходит проверка подлинности (Laravel 5.2)

Вы можете проверить AuthenticatesUsers Trait. То есть функция getLogin() получила название

+0

Я не думаю, что это работает, так как эти методы даже не запускаются! Я положил 'dd (" hi') 'наверху методов, и они не запускались! Пример в моем коде был всего лишь примером. Мне нужно место, чтобы поместить мой код –

+0

. Как вы вошли в систему пользователя – oseintow

+0

используя 'Route :: get (' login ',' Auth \ AuthController @ getLogin ') -> name (' login '); 'и я не создал метод, называемый getLogin. Он сделал это автоматически! –

0

Из найденной документации Laravel here.

Определения Если текущий пользователь Аутентифицированного

Чтобы определить, если пользователь уже вошел в приложение, вы можете использовать метод проверки на фасаде Auth, который возвращает истину, если пользователя проверка подлинности:

if (Auth::check()) { 
    // The user is logged in... 
} 
+0

Но это не поможет определить, вошли ли другие пользователи. Я создаю приложение чата. –

0

Решение 1: Изменить пользователя контроллера [НЕ РЕКОМЕНДУЕТСЯ]

Через некоторое Внимательное изучение AuthicatesUsers черта мне удалось решить эту проблему:

Я добавил следующий метод к User модели;

public function authenticated($request, User $user) { 
    $user->is_logged_in = true; 
    $user->save(); 
    return redirect()->intended($this->redirectPath()); 
} 

public function getLogout() 
{ 
    if (Auth::check()) { 
     $user = Auth::user(); 
     $user->is_logged_in = false; 
     $user->save(); 
    } 

    Auth::logout() 
    return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); 
} 

Решение 2: Используйте события [РЕКОМЕНДУЕТСЯ]

Я обнаружил, что решение 1, возможно, не самый лучший способ, так как есть и другие способы, пользователь может войти (например, социальной аутентификации).

Поэтому лучше использовать события. т.е. добавить их к методу EventServiceProviderboot:

public function boot(DispatcherContract $events) 
{ 
    parent::boot($events); 

    $events->listen('auth.login', function (User $user, $remember) { 
     $user->is_logged_in = true; 
     $user->save(); 
    }); 

    $events->listen('auth.logout', function (User $user) { 
     $user->is_logged_in = false; 
     $user->save(); 
    }); 
} 
Смежные вопросы