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

السؤال

نشر

لدي نموذج Post و ملف تهجير به الأعمدة التالية:

<?php

Schema::create('posts', function (Blueprint $table) {
  $table->id();
  $table->string('title');
  $table->string('slug');
  $table->text('body');
  $table->timestamps();
});

أريد عند إنشاء سجل من هذا النموذج يتم إعطاء slug تلقائياً حسب العُنوان المُمرر.

Recommended Posts

  • 1
نشر

يُمكنك عمل هذا الأمر بإستخدام أحد هذه الطرق:

  • تمرير قيمة ال slug أثناء إنشاء السجل في المُتحكم:
<?php

use Illuminate\Support\Str;

Post::create([
  'title' => request('title'),
  'body' => request('body'),
  'slug' => Str::slug(request('title'))
]);
  • إعادة تعريف الدالة boot في المُتحكم Post و التسمع على الحدث creating:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Post extends Model
{
    use HasFactory;

    protected $guarded = [];

    protected static function boot()
    {
        parent::boot();
        static::creating(function ($post) {
            $post->slug = Str::slug($post->title);
        });
    }


}

يُمكن التسمع على عدة أحداث: creating، created ، deleting، deleted، updating، updated ... 

لكن إن كانت الأحداث التي تُريد التسمع عليها كثيرة و ترغب بعمل شيء ما عند كل حدث فسيُصبح النموذج مُكتض بالشيفرات و ستصعب عليك عملية ال refactoring ففي هذه الحالة الأفضل إستخدام مُراقب (observer) لهذا النموذج.

  • إستخدام مراقب (observer):

أولاً إنشاء المُراقب:

php artisan make:observer PostObserver --model=Post

سيُنشئ الأمر ملف جديد في المسار: app/Observers و من خلاله يُمكنك مراقبة النموذج الخاص بك.

ثانياً في حالتنا سنُضيف الدالة: creating :

<?php

namespace App\Observers;

use App\Models\Post;
use Illuminate\Support\Str;

class PostObserver
{

  public function creating(Post $post)
  {
    $post->slug = Str::slug($post->title);
  }

  // others methods

}

ثالثاً نقوم بربط المُراقب بالنموذج الذي سيُراقبه و يتم ذلك على مُستوى مُزود الخدمة EventServiceProvider في الدالة boot:

<?php

use App\Models\Post;
use App\Observers\PostObserver;

public function boot()
{
  Post::observe(PostObserver::class);
}

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...