اذهب إلى المحتوى
  • 0

كيفية تخزين البيانات المضافة حديثاً في cache ضمن Laravel

Amir Alsaeed

السؤال

لدي جدول posts ضمن قاعدة البيانات في لارافيل:

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedInteger('user_id');
            $table->unsignedInteger('category_id');
            $table->string('title');
            $table->longText('body');
            $table->string('thumbnail_path')->nullable();
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
        });
    }

وقمت باستخدام cache في لارافيل لحفظ نسخة من المنشورات عن طريق الحدث event:

namespace App\Listeners;

use App\Post;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use cache;

class PostCacheListener
{
    
    public function __construct()
    {
     
    }

    public function handle($event)
    {
        
        
        $post = Post::all();

        
    }
}

كيف يمكنني حفظ نسخة من المنشورات الجديدة التي يتم إضافتها إلى قاعدة البيانات، فعند إضافة أي حقول جديدة إلى قاعدة البيانات يتم استعادة النسخة القديمة من الكاش دون تحديث.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يمكن تنفيذ ذلك عن طريق وضع حدث عند إنشاء المنشور بالإضافة إلى listener للكاش الموجود، بحيث يتم استدعائه عند كل عملية تعديل أو إضافة سجلات إلى الجدول المعني في قاعدة البيانات كالتالي:

php artisan make:event PostCreated

بحيث يكون PostCreated.php عند إنشاء المنشور:

	namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class PostCreated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

 
    public function __construct()
    {
        //
    }

    public function broadcastOn()
    {
        return [];
    }
}

وبعدها نقوم بإضافة:

cache()->forget('posts');

والتي تقوم بمسح الكاش الخاص بال posts عند إضافة post جديد، وأيضاً نقوم بإضافة:

cache()->forever('posts', $post);

بعد استعادة البيانات ليتم حفظها من جديد على نسخة الكاش الجديدة، فيصبح ترتيب العمليات كالتالي:

public function handle($event)
    {
        
        cache()->forget('posts'); // تحرير النسخة القديمة من الكاش

        $post = Post::all(); //جلب البيانات

        cache()->forever('posts', $post); // حفظهم في نسخة كاش جديدة
    
    }

فعند إطلاق الحدث ، سنقوم بإزالة جميع بيانات ذاكرة التخزين المؤقت. بعد ذلك سنقوم بإحضار جميع البيانات من قاعدة البيانات ووضعها في ذاكرة التخزين المؤقت ضمن Laravel إلى الأبد. يمكنك أيضاً وضعها لبضع دقائق ، يوم ، سنة كما تريد.

بعدها يجب تعديل مودل Post لنضيف عليه الحدث كالتالي:

namespace App;

use App\Events\PostCreated;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{

  //...

  protected $dispatchesEvents = [
    'created' => PostCreated::class 
  ];

بحيث يتم إطلاق هذا الحدث PostCreated عندما يتم إضافة أي منشور جديد. وبالتالي يقوم باستدعاء listener الخاص بتحديث الكاش.

وأخيراً، يجب تسجيل الحدث في لارافيل كالتالي:

namespace App\Providers;

use App\Events\PostCreated;
use App\Listeners\PostCacheListener;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;

class EventServiceProvider extends ServiceProvider
{
    
    protected $listen = [

        PostCreated::class => [
            PostCacheListener::class, //نفس الحدث الذي قمنا بتعريفه مسبقاً
        ],

    ];

    public function boot()
    {
        parent::boot();

        //
    }
}

وبذلك عند إضافة أي سجل جديد إلى قاعدة البيانات، في حال لم تحتوي نسخة الكاش هذه البيانات عند طلبها سيتم تحديث النسخة القديمة من الكاش وتخزين نسخة جديدة تحوي البيانات التي تم إضافتها مؤخراً إلى قاعدة البيانات.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...