現在我們決定使用緩存實現這個特性,下一個問題是這個代碼應該在哪裏運行,以便它在每個請求上運行?我有兩個想法可以實現:
- 創建一個 BaseController,讓你所有的 Controller 都繼承它
- 創建一箇中間件
經過一些思考,並意識到我需要在所有已經編寫的構造函數中添加對父構造函數的調用,我選擇在中間件中實現。
我們有個計劃,讓我們進入代碼!
首先,我們需要創建一箇中間件。在終端中輸入以下命令:
php artisan make:middleware LogLastUserActivity
複製代碼
接下來我們打開以下php文件 app/Http/Middleware/LogLastUserActivity.php. 在其中的 handle 方法中添加下面的代碼:
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!
作者:Summer__
鏈接:https://juejin.im/post/5db64cdcf265da4d23758b62
來源:掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。