[英]Laravel 7 Event listener and caching is not working
I am facing some difficulties while developing an app on Laravel. I want to use Event and Listener to delete and rebuild the cache of an object.我在Laravel上开发一个app遇到了一些困难,我想用Event和Listener删除重建一个object的缓存。
Here is the code:这是代码:
app\Events\CampaignEvent.php
namespace App\Events;
use Illuminate\Queue\SerializesModels;
class CampaignEvent extends Event
{
use SerializesModels;
public $user_id;
public $cache_keys;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($user_id, $cache_keys)
{
$this->user_id = $user_id;
$this->cache_keys = $cache_keys;
}
}
app\Listenters\CampaignListener.php
<?php
namespace App\Listeners;
use App\Events\CampaignEvent;
use Cache;
use Log;
use App\BrandCampaign;
class CampaignListener
{
/**
* Handle the event.
*
* @param CampaignEvent $event
* @return void
*/
public function handle(CampaignEvent $event)
{
/**
* Remove cache
*/
if(is_array($event->cache_keys)){
foreach($event->cache_keys as $index => $cache_key){
\Cache::forget($cache_key);
Log::debug("[CACHE] Deleted cache for: " . $cache_key);
}
} else {
\Cache::forget($event->cache_keys);
Log::debug("[CACHE] Deleted cache for: " . $event->cache_keys);
}
/**
* Rebuild cache for BrandCampaigns
*/
$campaigns = BrandCampaign::with(['influencers' => function($query){
$query->with(['influencer' => function($query){
$query->select('id','profile_picture');
}])->latest();
}])->where('user_id', $event->user_id )->latest()->get();
$total_influencers = [];
foreach($campaigns as $campaign){
foreach ($campaign->influencers as $influencer) {
if(!in_array($influencer->influencer_id, $total_influencers))
$total_influencers[] = $influencer->influencer_id;
}
}
$total_influencers = count($total_influencers);
$campaigns = collect($campaigns)->toArray();
\Cache::forever('@suppliers_campaigns('.$event->user_id.')', $campaigns);
\Cache::put('@suppliers_total_campaigns('.$event->user_id.')', $total_influencers, 10);
Log::debug("[CACHE] Cache rebuilt successfully!");
return $event;
}
}
I want to cache an array "forever", but in my campaign controller, after the event is fired, when I pull the array from cache it is returning null我想“永远”缓存一个数组,但在我的活动 controller 中,事件触发后,当我从缓存中拉出数组时,它返回 null
Thanks!谢谢!
app\Events\CampaignEvent.php
namespace App\Events;
use Illuminate\Queue\SerializesModels;
class CampaignEvent extends Event
{
use SerializesModels;
public $user_id;
public $cache_keys;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($user_id, $cache_keys)
{
$this->user_id = $user_id;
$this->cache_keys = $cache_keys;
}
}
app\Listenters\CampaignListener.php
<?php
namespace App\Listeners;
use App\Events\CampaignEvent;
use Cache;
use Log;
use App\BrandCampaign;
class CampaignListener
{
/**
* Handle the event.
*
* @param CampaignEvent $event
* @return void
*/
public function handle(CampaignEvent $event)
{
/**
* Remove cache
*/
if(is_array($event->cache_keys)){
foreach($event->cache_keys as $index => $cache_key){
\Cache::forget($cache_key);
Log::debug("[CACHE] Deleted cache for: " . $cache_key);
}
} else {
\Cache::forget($event->cache_keys);
Log::debug("[CACHE] Deleted cache for: " . $event->cache_keys);
}
/**
* Rebuild cache for BrandCampaigns
*/
$campaigns = BrandCampaign::with(['influencers' => function($query){
$query->with(['influencer' => function($query){
$query->select('id','profile_picture');
}])->latest();
}])->where('user_id', $event->user_id )->latest()->get();
$total_influencers = [];
foreach($campaigns as $campaign){
foreach ($campaign->influencers as $influencer) {
if(!in_array($influencer->influencer_id, $total_influencers))
$total_influencers[] = $influencer->influencer_id;
}
}
$total_influencers = count($total_influencers);
$campaigns = collect($campaigns)->toArray();
\Cache::forever('@suppliers_campaigns('.$event->user_id.')', $campaigns);
\Cache::put('@suppliers_total_campaigns('.$event->user_id.')', $total_influencers, 10);
Log::debug("[CACHE] Cache rebuilt successfully!");
return $event;
}
}
Works in Laravel 5 (based on the question) & Laravel 7 (latest) as well.也适用于 Laravel 5(基于问题)和 Laravel 7(最新)。
use Illuminate\Support\Facades\Cache;
// Remove cache
Cache::forget('brandCampaigns');
// Rebuild cache for BrandCampaigns. Here, when the cache key doesn't exists, the function will be called and the returned value will be stored in the cache
$campaigns = Cache::rememberForever('brandCampaigns', function () {
return BrandCampaign::with(['influencers' => function ($query) {
$query->with(['influencer' => function ($query) {
$query->select('id', 'profile_picture');
}])->latest();
}])->where('user_id', $event->user_id)->latest()->get();
});
you need to catch the result in the variable您需要在变量中捕获结果
use Illuminate\Support\Facades\Cache;
class CampaignListener
{
/**
* Handle the event.
*
* @param CampaignEvent $event
* @return void
*/
public function handle(CampaignEvent $event)
{
$user_id = $event->user_id;
$cache_keys = $event->cache_keys;
foreach ($cache_keys as $key) {
if (Cache::has($key)) {
Cache::forget($key);
}
}
$brand_campaigns = BrandCampaign::where('user_id', $user_id)->get();
foreach ($brand_campaigns as $brand_campaign) {
$brand_campaign_key = "brand_campaign_{$brand_campaign->id}";
Cache::forever($brand_campaign_key, $brand_campaign);
}
}
In your CampaignController, you can fire the event like this:在您的 CampaignController 中,您可以像这样触发事件:
use App\Events\CampaignEvent;
public function update(Request $request, $id)
{
// your code to update the campaign
event(new CampaignEvent($user_id, $cache_keys));
}
In the EventServiceProvider file, you can register the listener like this:
use App\Events\CampaignEvent;
use App\Listeners\CampaignListener;
protected $listen = [
CampaignEvent::class => [
CampaignListener::class,
],
];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.