Laravel 中使用簡單的方法跟蹤用戶是否在線

文章轉發自專業的Laravel開發者社區,原始連接:learnku.com/laravel/t/7…php

今天,個人任務是,在Laravel應用程序用戶我的資料頁面上,用戶名旁邊添加一個綠點,表示他們是否在線。我首先想到的是,咱們將須要啓動一個node.js服務器並跟蹤每一個用戶的活動套接字鏈接。而後用當前登陸的用戶套接字,咱們能夠實時更新在線狀態!惟一的問題是,這是咱們目前的要求,有點超過頂部,並無徹底必要的,直到咱們的功能,須要達到第二個準確性,如實時聊天。node

一位同事指出,對於目前的需求,MySpace用來處理「在線」功能的方式可能就足夠了。就咱們所知,MySpace用來顯示用戶是否在線的方式是基於他們在網站上的最後一項活動。若是他們的最後一次活動在X分鐘內,咱們會顯示「在線」徽章,若是沒有,咱們不會。簡單!laravel

讓咱們爲用戶的上次活動在用戶表中添加一個字段,而且在請求每一個頁面時更新它。而後當咱們須要檢查用戶是否在線,咱們能夠將該時間戳與當前時間戳進行比較,若是在X分鐘內,則他們在線!雖然這能夠工做得很好,這取決於你正在構建的應用程序,它會向數據庫添加沒必要要的 寫入,這會在某種程度上下降你應用程序的速度。一個好的折衷辦法是將這些信息存儲在應用程序緩存中。 緩存的好處是能夠簡化這種方法,由於能夠設置緩存爲過時。web

如今咱們決定使用緩存實現這個特性,下一個問題是這個代碼應該在哪裏運行,以便它在每一個請求上運行?我有兩個想法能夠實現:數據庫

  1. 建立一個 BaseController,讓你全部的 Controller 都繼承它
  2. 建立一箇中間件

通過一些思考,並意識到我須要在全部已經編寫的構造函數中添加對父構造函數的調用,我選擇在中間件中實現。api

咱們有個計劃,讓咱們進入代碼!數組

首先,咱們須要建立一箇中間件。在終端中輸入如下命令:緩存

php artisan make:middleware LogLastUserActivity
複製代碼

接下來咱們打開如下php文件 app/Http/Middleware/LogLastUserActivity.php. 在其中的 handle 方法中添加下面的代碼:bash

if(Auth::check()) {
    $expiresAt = Carbon::now()->addMinutes(5);
    Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
}

複製代碼

接下來,咱們打開 app/Http/Kernel.php 文件。若是您使用的是 Laravel 5.1 或 更早的版本, 您應該把代碼直接放置到$middleware 數組中。 若是您的版本是 5.2.* , 您應該把代碼放置到 $middlewareGroups 的 web 中 。注意,必定要把代碼放到 StartSession 中間件的下方,不然 Auth 門面將不會正確在user中記錄log。個人更新配置設置以下:服務器

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class
        \App\Http\Middleware\VerifyCsrfToken::class,
        \App\Http\Middleware\LogLastUserActivity::class,
    ],
    'api' => [
        'throttle:60,1',
    ],
];

複製代碼

最後一步是添加一個方法到咱們的 user 對象中去檢測這個值. 在 app/User.php 咱們添加下面的方法:

public function isOnline()
{
    return Cache::has('user-is-online-' . $this->id);
}
複製代碼

如今在任何頁面中你就能添加下面的方法:

@if($user->isOnline())
    user is online!!
@endif

複製代碼

重要提示 -- 確保在你的文件頂部使用 use 引入全部的 facades!

我但願上面這些能幫助到大家解決這個問題!

相關文章
相關標籤/搜索