2016-07-07 6 views
1

私のアプリケーションで私はLaravelの認証システムを使用しており、依存関係注入(またはFacade)を使用してログインユーザーにアクセスします。私はこのような熱心な負荷に傾向があること、認証されたユーザーの関係をキャッシュするLaravel

class Controller extends BaseController 
{ 
    protected $user; 

    public function __construct() 
    { 
     $this->user = \Auth::user(); 
    } 
} 

私のユーザーが別の関係の数があります:私は、私は私の子クラスに簡単にアクセスできるように、私のベースのコントローラを介してアクセスできるユーザーでログインする傾向がある

$this->user->load(['relationshipOne', 'relationshipTwo']); 

このプロジェクトでは、一貫して大量のトラフィックを受信することを期待しています。できるだけスムーズかつ効率的にアプリケーションを実行したいので、キャッシュを実装したいと考えています。

私は理想的には、特にユーザーの関連レコードのデータベースを繰り返しクエリすることを避けることができる必要があります。そのため、関係をロードした後で、ユーザーオブジェクトのキャッシュを調べる必要があります。

public function __construct() 
{ 
    $userId = \Auth::id(); 
    if (!is_null($userId)) { 
     $this->user = \Cache::remember("user-{$userId}", 60, function() use($userId) { 
      return User::with(['relationshipOne', 'relationshipTwo'])->find($userId); 
     }); 
    } 
} 

は、しかし、私はそれが認証をパスするために、非null値を返す\Auth::id()かどうかに依存しても安全ですかどうかわからないよ:

は、私はこのような何かをする考えを持っていました。誰も似たような問題に直面していますか?

答えて

0

まあ、私はいくつか混乱した後、私は私が私が分かち合うと思った自分のための解決策を考え出した。

私は実際のUserオブジェクトをキャッシュすることをあきらめ、通常のように認証を行い、ユーザーの関係をキャッシュしようとします。私のロジックがモデルであるので、これは、それを行うにはかなり汚いやり方のように感じている:私は内部のいくつかのメソッドを持っていたので、私の場合は

class User extends Model 
{ 
    // .. 

    /** 
    * This is the relationship I want to cache 
    */ 
    public function related() 
    { 
     return $this->hasMany(Related::class); 
    } 

    /** 
    * This method can be used when we want to utilise a cache 
    */ 
    public function getRelated() 
    { 
     return \Cache::remember("relatedByUser({$this->id})", 60, function() { 
      return $this->related; 
     }); 
    } 

    /** 
    * Do something with the cached relationship 
    */ 
    public function totalRelated() 
    { 
     return $this->getRelated()->count(); 
    } 
} 

、私はUserモデル内の関連項目をキャッシュできるようにするために必要なその関係を使用するユーザー。上記のtotalRelatedメソッドのかなり簡単な例のように(私のプロジェクトはもう少し複雑です)。もちろん

、私は私のUserモデルのような内部メソッドを持っていなかった場合、(例えば、コントローラで)

class MyController extends Controller 
{ 
     public function index() 
     { 
      $related = \Cache::remember("relatedByUser({$this->user->id})", 60, function() { 
       return $this->user->related; 
      }); 

      // Do something with the $related items... 
     } 
} 
というのが私のモデルとキャッシュ外部からの関係を呼び出すことも簡単だっただろう

もう一度、これは私にとって最高の解決策ではないと感じています。私は他の提案を試みています。

乾杯


編集:私はさらに一歩行って、キャッシュの関係を支援するために私の親Modelクラスのメソッドのカップルを実装し、受け入れるすべての私relatonshipsのgetterメソッドを実装しました$useCacheパラメータ、物事はもう少し柔軟にします

親モデルクラス:

class Model extends BaseModel 
{ 
    /** 
    * Helper method to get a value from the cache if it exists, or using the provided closure, caching the result for 
    * the default cache time. 
    * 
    * @param $key 
    * @param Closure|null $callback 
    * @return mixed 
    */ 
    protected function cacheRemember($key, Closure $callback = null) 
    { 
     return Cache::remember($key, Cache::getDefaultCacheTime(), $callback); 
    } 

    /** 
    * Another helper method to either run a closure to get a value, or if useCache is true, attempt to get the value 
    * from the cache, using the provided key and the closure as a means of getting the value if it doesn't exist. 
    * 
    * @param $useCache 
    * @param $key 
    * @param Closure $callback 
    * @return mixed 
    */ 
    protected function getOrCacheRemember($useCache, $key, Closure $callback) 
    { 
     return !$useCache ? $callback() : $this->cacheRemember($key, $callback); 
    } 
} 

マイUserクラス:

class User extends Model 
{ 
    public function related() 
    { 
     return $this->hasMany(Related::class); 
    } 

    public function getRelated($useCache = false) 
    { 
     return $this->getOrCacheRemember($useCache, "relatedByUser({$this->id})", function() { 
      return $this->related; 
     }); 
    } 
} 

使用法:

$related = $user->getRelated(); // Gets related from the database 
$relatedTwo = $user->getRelated(true); // Gets related from the cache if present (Or from database and caches result) 
関連する問題