' />


' />
🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۱ Mahdi
use Cache::forget(\'key\')
جامعه لاراول ایجاد شده در ۱۴ دی ۱۴۰۱

سلام به چه شکل میشه از Cache::forget('key') در observer استفاده کرد؟

سلام مهدی جان

باید ببینید در چه مواردی بعد از هر عملیات (CRUD) نیاز هست که آخرین تغییرات رو داشته باشید و توی هرکدوم که لازم بود کش‌ها رو پاک کنید.

مثلا ویدیو‌ها رو کش کردیم، وقتی ویدیو جدیدی اضافه بشه یا ویدیو ویرایش یا حذف شد نیاز هست که کش پاک بشه تا وقتی کاربری به صفحه ویدیو‌ها رفت دوباره ویدیوها کش بشه تا به آخرین تغییراتی که توی جدول ویدیو‌ها هست دسترسی داشته باشه.

پس توی Observer مربوط به ویدیو‌ها و توی متدهای created, updated, deleted نیاز هست که از Cache::forget استفاده کنیم.

صادق برزگر ۱۵ دی ۱۴۰۱، ۰۳:۵۸

درست میفرمایید سوال من در مورد نحو پیاده سازی cache::forget هست

Cache::forget('key')

کلید ما هم prefix هست

$CacheKeyName = 'likes_count_for_' . class_basename($this) . $this->id;

و این this‌ها بعضی وقت‌ها مربوط به مدل comment هست و بعضی وقت‌ها video

اگر دو مدل مذکور بالا فراخونی کنیم بازم نمیشه اون کلید unique رو ایجاد کنیم

Mahdi ۱۵ دی ۱۴۰۱، ۰۷:۱۷

سلام مجدد مهدی جان، الان متوجه سوالتون شدم.

برای استفاده از کلید کش در جاهای مختلف باید در تریت Likable یک متد جدید بسازید که کلید کش رو توی اون بزارید و هروقت نیاز شد فراخونی کنید. مثلا:

// App\\Models\\Traits\\Likable
public function getLikeCacheKeyName()
{
    return 'likes_count_for_' . class_basename($this) . $this->id;
}

حالا، نیاز هست که متدهای مربوط به نمایش تعداد لایک و دیسلایک رو تصحیح کنید و از متد بالا برای کلید کش استفاده کنید.

در مورد Observer هم میتونید به شکل زیر عمل کنید:

// App\\Observers\\LikeObserver
Cache::forget($like->likable()->getLikeCacheKeyName());


صادق برزگر ۱۶ دی ۱۴۰۱، ۰۳:۳۶

تشکر از شما

ولی الان داستانی ک پیش اومده اینکه کلا دیگه count یی بر روی لایک‌ها صورت نمیگیره

    public function getLikeCountAttribute()
    {
        $CacheKeyName = $this->getCacheKeyNameAttribute();
        return Cache::remember($CacheKeyName, 5, function () {
            return $this->likes()
                ->where('vote', '1')
                ->count();
        });
    }
    public function getDislikeCountAttribute()
    {
        $CacheKeyName = $this->getCacheKeyNameAttribute();
        return Cache::remember($CacheKeyName, 5, function () {
            return $this->likes()
                ->where('vote', '-1')
                ->count();
        });
    }
    public function getCacheKeyNameAttribute()
    {
        return 'disliked_count_for_' . class_basename($this) . $this->id;
    } 

مگر اینکه از کش کردن بخواییم خارج شیم

ی بار هم cache:clear کردم ک اگه داستانی وجود داره پاک بشه ولی موضوع بازم حل نشد .

اینم اضافه کنم ک من همزمان 3,4 تا پروژه در موازات هم ایجاد کردم برای تمرین بیشتر و بیشتر و هربار از یکی به یکی سویچ میکنم

البته ک دیتابیس‌های این پروژها کاملا متفاوته و هیچ تداخلی از این بابت نیست حالا امکان داره مشکلاتی ک برای من بوجود میاد بر گرده به این مسئله؟

Mahdi ۱۶ دی ۱۴۰۱، ۰۵:۲۱

مهدی جان اگه دقت کنید در getCacheKeyNameAttribute اومدید disliked رو گذاشتید و توی هر دو تابع getLikeCountAttribute و getDislikeCountAttribute از همون استفاده کردید که این درست نیست، باید برای هر کدوم کلیدشون جدا باشه.

صادق برزگر ۱۶ دی ۱۴۰۱، ۰۵:۳۰

مهندس اصلاح انجام دادم

برای observer هم

public function created(Like $like)
    {
        Cache::forget($like->likeable()->getCacheDislikeAttribute());
    }

به خطای

sha1(): Argument #1 ($string) must be of type string, Illuminate\\Database\\Eloquent\\Relations\\MorphTo given

در تاپیک زیرلینک پروژه مربوط ذاشته شده

https://7learn.com/app/topics/14042

Mahdi ۱۶ دی ۱۴۰۱، ۰۹:۴۳

مهدی جان، کدتون رو بصورت زیر استفاده کنید تا مشکل برطرف بشه:

Cache::forget($like->likeable->getCacheDislikeAttribute());
// OR
Cache::forget($like->likeable->cache_dislike);
صادق برزگر ۱۶ دی ۱۴۰۱، ۱۰:۳۳

استاد تشخیص اینکه چ زمان از property یا method باید استفاده کنیم به چ شکله؟

Mahdi ۱۶ دی ۱۴۰۱، ۱۰:۵۳

بستگی به کاری که میخواید انجام بدید باید از property یا method استفاده کنید.

وقتی میخواید با استفاده از ریلیشن‌ها عملیاتی مثل create, update یا where و ... رو انجام بدید باید از متد استفاده کنید چون نیاز به query builder هست و وقتی بصورت متد ریلیشن رو صدا میزنیم به ما یه query builder برمیگردونه و میتونیم عملیات موردنظرمون رو انجام بدیم و در صورت نیاز حتی خروجی هم بگیریم.

وقتی فقط نیاز به گرفتن خروجی داشته باشیم باید ریلیشن‌ها رو بصورت propety استفاده کنیم.


موفق باشید.

بهترین پاسخ
صادق برزگر ۱۶ دی ۱۴۰۱، ۱۱:۵۷

ممنون وتشکر?

Mahdi ۱۶ دی ۱۴۰۱، ۱۲:۲۸