Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Aşağıdaki gibi; Page modeline Translatable paketini ekledim.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

use Astrotomic\Translatable\Contracts\Translatable as TranslatableContract;
use Astrotomic\Translatable\Translatable;

class Page extends Model implements TranslatableContract
{
    use SoftDeletes;
    use HasFactory;
    use Translatable;

    protected $fillable = [
    ];

    protected $translatedAttributes = [
        'title',
        'content',
        'meta',
        'status',
        'slug'
    ];

    public function albums()
    {
        return $this->belongsToMany(Album::class);
    }

    public function collections()
    {
        return $this->belongsToMany(Collection::class);
    }

}

PageController'da da şu şekilde kayıt ediyorum.

    public function store(PageRequest $request)
    {
        $request->validated();
        $request['status'] = $request->boolean('status');
        $page=Page::create($request->all());
        $page->albums()->attach($request->input('albums'));
        $page->collections()->attach($request->input('collections'));
        return redirect(route('backend.pages.index'))->with('success', 'Sayfa oluşturuldu.');
    }

Hal böyle olunca $fillable değişkeni boş olmak zorunda kaldı, çünkü bütün alanlar translatedAttributes dizisine eklendi.
Boş olunca da "Add [_token] to fillable property to allow mass assignment on [App\Models\Page]." hatasını alıyorum.

Nasıl yapmalıyım?
Bütün alanlar $translatedAttributes alanında ve fillable alanı boş olmak durumunda gibi görünüyor.

Fillable dizisi boş olduğu halde, şu kod ile kayıt yapınca hata almadım.
fillable dizi boş olunca güvenlik konusunda problem olur mu acaba?

public function store(PageRequest $request)
{
    // Formdan gelen verileri doğrulayıp yalnızca geçerli verileri al
    $validatedData = $request->validated();
    
    // Status değerini Boolean olarak ayarla
    $validatedData['status'] = $request->boolean('status');
    
    // Sayfayı oluştur
    $page = Page::create($validatedData);
    
    // İlişkili albümleri ekle
    if ($request->has('albums')) {
        $page->albums()->attach($request->input('albums'));
    }
    
    // İlişkili koleksiyonları ekle
    if ($request->has('collections')) {
        $page->collections()->attach($request->input('collections'));
    }
    
    return redirect(route('backend.pages.index'))->with('success', 'Sayfa oluşturuldu.');
}

$fillable = [ ]; silip protected $guarded = [ ]; ekleyebilirsiniz. Validation da tüm alanların gerekli olması için.

7 gün sonra

fillable: Yalnızca izin verilen alanların atamasına izin verir.
guarded: Tüm alanların atamaya açık olmasına izin verir.

guarded kullanılırken dikkat edilmesi gerekiyor, riskli işlemler açığa çıkarabiliyor. Örnek;

class User extends Model
{
    //name, email, password, is_admin
    protected $guarded = [];
}

$request->validate([
    'name' => 'required|string',
    'email' => 'required|email',
    'password' => 'required|string|min:8'
]);

//kullanıcı is_admin değerini true olarak gönderiyor.

User::create($request->all());

Bu durumda kullanıcı gönderilen isteği manipüle edip is_admin değerini true gönderdiği için Admin olarak sisteme kayıt edilecektir. Bu tarz kullanımlar için önlemlerin alınması gerekmektedir.