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

ملء حقل إعتمادا على حقل آخر أثناء إنشاء سجل جديد في لارافيل

Mahmoud Alrashidi

السؤال

لدي نموذج 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...