Laravel'de “Kitle Ataması” ne anlama geliyor?


159

Eloquent ORM konu bölümü hakkında Laravel Belgesi'ne girdiğimde yeni bir dönem aldım Mass Assignment.

Belge, Toplu Atama ve fillableveya guardedözellikler ayarlarının nasıl yapılacağını gösterir . Ama bundan geçtikten sonra, Mass Assignmentnasıl çalıştığını ve nasıl çalıştığını net bir şekilde anlamadım .

CodeIgniter'deki geçmiş tecrübemde, bu terimi de duymadım.

Bunun hakkında basit bir açıklaması olan var mı?


Yanıtlar:


206

Kitle ataması, model oluşturmaya bir dizi gönderdiğinizde, temel olarak modeldeki bir grup alanı tek tek değil, tek tek bir seferde ayarlamaktır:

$user = new User(request()->all());

(Bu, modeldeki her bir değeri ayrı ayrı ayarlamak yerine.)

Kullanabilirsiniz fillableHangi alanların güncellemeye gerçekten izin vermesini istediğinizi korumak .

Bunu yaparak tüm alanların toplu olarak atanmasını da engelleyebilirsiniz:

protected $guarded = ['*'];

Diyelim ki kullanıcı tablonuzda bir alan var user_type , kullanıcı / yönetici değerlerine sahip olabilecek var

Açıkçası, kullanıcıların bu değeri güncellemesini istemezsiniz. Teorik olarak, yukarıdaki kodu kullandıysanız, birisi yeni bir alana bir forma enjekte edebilir.user_type ve diğer form verileriyle birlikte 'admin' gönderebilir ve hesaplarını kolayca bir yönetici hesabına ... kötü haber.

Toplayarak:

$fillable = ['name', 'password', 'email'];

Yalnızca bu değerlerin mass assignment

user_typeDeğeri güncelleyebilmek için, değeri açıkça modelde ayarlamanız ve kaydetmeniz gerekir, örneğin:

$user->user_type = 'admin';
$user->save();

16
Bu cevap için teşekkürler, ben $user = new User(Input::all());(programcı olarak) böyle kontrolsüz (ya da hangi senaryoda bu yararlı olurdu) gibi bir şey kimin yapacağını oldukça anlamıyorum .
Kyslik

14
... bu sorunun cevabı değil, cevabı güvenlik vb. hakkında bir bütün ders olarak ele geçirmeden kısa tutmak
duellsy

3
Anladım ve bu cevabı bulduğuma sevindim. Ben sadece hangi senaryo yukarıda (benim yorumda) yararlı alıntı olduğunu merak ediyorum. Yani doğrulama olmadan ve etrafındaki her şey.
Kyslik

4
yani 'Laravel'de “Kitle Ataması” ne anlama geliyor?' Doğrulama konusunda ayrıntıya girmeliydim ... bu, yoldan çıkmadan soruya basit bir cevaptı. Bunu olduğu gibi bırakalım.
duellsy

8
Sorduğum OP sorusunun anlamı önemli değil, bu yüzden yeni bir iş parçacığı oluşturmak zorunda değilim ve siz neden "neden olmasın" hakkında konuşmaya devam ediyorsunuz. Birisinin sizin yazdığınızda neden satır kullandığını anlamıyorum$user = new User; $user->name = 'Neo';
Kyslik

26

Toplu atama, belirtilen modele bir kerede kaydedilecek bir veri dizisi gönderme işlemidir. Genel olarak, modelinizdeki verileri tek tek kaydetmeniz gerekmez, daha ziyade tek bir işlemle kaydetmeniz gerekmez.

Toplu atama iyidir, ancak arkasında bazı güvenlik sorunları vardır. Birisi modele bir değer iletirse ve koruma olmadan kimlik dahil tüm alanları kesinlikle değiştirebilir. Bu iyi değil.

Let Diyelim ki alanlar ile, 'öğrencilerin tablo var demek "student_type, first_name, LAST_NAME” Sen kitle assign 'first_name, last_name' isteyebilirsiniz. Ama koruma istediğiniz student_type doğrudan değiştirip. Yıllardan bu nerede doldurulabilir ve korunan yapması yerine.

Doldurulabilir, modelinizde hangi alanların toplu olarak atanabileceğini belirlemenizi sağlar, bunu modele özel değişken ekleyerek yapabilirsiniz $fillable. Yani modelde:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

' student_type ' dahil edilmez, yani muaf tutulurlar.

Korumalı, doldurulabilir olanın tersidir. Doldurulabilir, hangi alanların toplu olarak atanacağını belirtirse, korumalı hangi alanların toplu olarak atanamayacağını belirtir. Yani modelde:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

$ doldurulabilir veya $ korumalı - her ikisini birden kullanmamalısınız.

Daha fazla bilgi için bağlantıyı açın: - Toplu Atama


1
Bu Matt Stauffer kitabında "laravel Up & Running" düz dışarı
çırpıcı

5

Toplu atama, bir satırı bir veri dizisi kullanarak birden fazla sütuyla doldurduğunuz anlamına gelir. (diziyi manuel olarak oluşturmak yerine bir kısayol) kullanın Input::all().

Teknik olarak sadece kafamın üstünden. Doldurulabilir, tablodaki hangi sütunların eklenmesine izin verildiği anlamına gelir; korunan, modelin söz konusu sütuna ekleyemeyeceği anlamına gelir.

Like ile bir toplu atama yapmaya çalıştığınızda, "secret" adlı bir sütuna eklediğinizde ve bunun korumalı olduğunu belirlediğinizde, buna model aracılığıyla eklemeyi deneyebileceğinizi, ancak hiçbir zaman gerçekten eklenmeyeceğini unutmayın. veritabanı.

Bu, modeli kullanırken masanızdaki güvenlik ve koruma içindir. Kitle tahsisi, modele doldurulabilir ve korunan ve bir tür saldırılara karşı savunmasız hale getiren bir söylem ya da uyarı gibi görünüyor.


2

Bu, alınan bir veri dizisinin bir seferde bir kerede kaydedildiği zamandır.

Laravel'deki bu yöntemle ilgili güvenlik sorunları nedeniyle, istenen verilerin Modelde doldurulmasını istediğiniz alanları tanımlamanız önerilir.

$fillableDeğişkeni, veritabanı tablosunda doldurmak istediğiniz alanları tanımlamak için kullanabilirsiniz .

Örneğin

Protected $fillable = [‘username’, dob’, email’,];

Laravel veri toplu olarak atadığınızı algıladığında, sizi model sınıfında toplu olarak atamak istediğiniz alanları tanımlamaya zorlar.

Birisi, istenmeyen verileri veritabanınıza kolayca bir html formuna geçirebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.