Skip to content

Instantly share code, notes, and snippets.

@paulund
Last active March 16, 2023 18:10
Show Gist options
  • Save paulund/9b13d504fb5fd05af99ecb0378418d98 to your computer and use it in GitHub Desktop.
Save paulund/9b13d504fb5fd05af99ecb0378418d98 to your computer and use it in GitHub Desktop.
Laravel Cache Auth::user(). Learn how to cache the logged in user at https://paulund.co.uk/laravel-cache-authuser
<?php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
User::observe(UserObserver::class);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
// Config/auth.php
'providers' => [
'users' => [
'driver' => 'cache-user',
'model' => App\Models\User::class,
]
]
<?php
namespace App\Providers;
use App\Auth\CacheUserProvider;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
// Caching user
Auth::provider('cache-user', function() {
return resolve(CacheUserProvider::class);
});
}
}
<?php
namespace App\Auth;
use App\Models\User;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
use Illuminate\Support\Facades\Cache;
/**
* Class CacheUserProvider
* @package App\Auth
*/
class CacheUserProvider extends EloquentUserProvider
{
/**
* CacheUserProvider constructor.
* @param HasherContract $hasher
*/
public function __construct(HasherContract $hasher)
{
parent::__construct($hasher, User::class);
}
/**
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier)
{
return Cache::get("user.$identifier") ?? parent::retrieveById($identifier);
}
}
<?php
namespace App\Observers;
use Illuminate\Foundation\Auth\User;
use Illuminate\Support\Facades\Cache;
/**
* User observer
*/
class UserObserver
{
/**
* @param User $user
*/
public function saved(User $user)
{
Cache::put("user.{$user->id}", $user, 60);
}
/**
* @param User $user
*/
public function deleted(User $user)
{
Cache::forget("user.{$user->id}");
}
/**
* @param User $user
*/
public function restored(User $user)
{
Cache::put("user.{$user->id}", $user, 60);
}
/**
* @param User $user
*/
public function retrieved(User $user)
{
Cache::add("user.{$user->id}", $user, 60);
}
}
@paulund
Copy link
Author

paulund commented Mar 14, 2020

Hi @janzankowski this shouldn't be used for fetching users, this method is used to stop making calls to the database when the user has logged into your application.

@wakjoko
Copy link

wakjoko commented Apr 22, 2020

hi @paulund,

big applause for your idea on caching logged in user. i've got it working & it works like charm. thanks again.

and i wanted to share a bit of modification on user observer, to invalidate the cached user when the user is updating their profile.
so in case anyone stuck on getting the cache not being refreshed after a user updated their profile, here's my user observer.

<?php
namespace App\Observers;

use Illuminate\Foundation\Auth\User;
use Illuminate\Support\Facades\Cache;

class CacheLoggedInUserObserver
{
    public function saved(User $user)
    {
        $this->deleted($user);

        Cache::remember("user.{$user->id}", 60, function () use ($user) {
            return $user;
        });
    }

    public function deleted(User $user)
    {
        Cache::forget("user.{$user->id}");
    }

    public function restored(User $user)
    {
        $this->saved($user);
    }

    public function retrieved(User $user)
    {
        $this->saved($user);
    }
}

@dipenparmar12
Copy link

CacheUserProvider.php

Line number 31 should be.

    public function retrieveById($identifier)
    {
        return \Cache::get("user.$identifier") ?? parent::retrieveById($identifier);
    }

@dipenparmar12
Copy link

CacheUserProvider
Line number 31 should be.

    /**
     * @param mixed $identifier
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function retrieveById($identifier)
    {
        return Cache::get("user.$identifier") ?? parent::retrieveById($identifier); // here little Type
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment