Che cosa significa "Assegnazione di massa" in Laravel?


159

Quando ho esaminato il documento Laravel sulla parte dell'argomento ORM Eloquent, ho ottenuto un nuovo mandato Mass Assignment.

Il documento mostra Come eseguire l'assegnazione di massa e le impostazioni delle proprietà fillableo guarded. Ma dopo averlo verificato, non avevo una comprensione chiara di Mass Assignmentcome funzionasse.

Nella mia esperienza passata in CodeIgniter, anche io non ho sentito parlare di questo termine.

Qualcuno ha una semplice spiegazione al riguardo?


Risposte:


206

L'assegnazione di massa avviene quando si invia un array alla creazione del modello, fondamentalmente impostando un gruppo di campi sul modello in una sola volta, piuttosto che uno per uno, qualcosa del tipo:

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

(Questo invece di impostare esplicitamente ogni valore sul modello separatamente.)

È possibile utilizzare fillableper proteggere i campi in cui si desidera effettivamente consentire l'aggiornamento.

Puoi anche bloccare l'assegnazione di massa di tutti i campi in questo modo:

protected $guarded = ['*'];

Diciamo che nella tua tabella utente hai un campo che è user_typee che può avere valori di utente / amministratore

Ovviamente, non vuoi che gli utenti siano in grado di aggiornare questo valore. In teoria, se hai usato il codice sopra, qualcuno potrebbe iniettare in un modulo un nuovo campo user_typee inviare "admin" insieme agli altri dati del modulo, e passare facilmente il proprio account a un account admin ... cattive notizie.

Aggiungendo:

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

Stai assicurando che solo quei valori possano essere aggiornati usando mass assignment

Per poter aggiornare il user_typevalore, è necessario impostarlo esplicitamente sul modello e salvarlo, in questo modo:

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

16
Grazie per questa risposta, non capisco chi farebbe una cosa del genere $user = new User(Input::all());(come programmatore) che è così incontrollata (o in quale scenario sarebbe così utile).
Kyslik,

14
... non è affatto il punto della risposta, è di mantenere la risposta breve senza dirottarla come una lezione completa sulla sicurezza ecc.
duellsy,

3
Ho capito il punto e sono contento di aver trovato questa risposta. Sono solo curioso di sapere in quale scenario è utile la linea citata sopra (nel mio commento). Intendo senza convalida e tutta quella roba in giro.
Kyslik,

4
quindi pensi in risposta a una domanda intitolata "Che cosa significa" Assegnazione di massa "in Laravel?" Avrei dovuto entrare nei dettagli sulla convalida ... era una semplice risposta alla domanda senza uscire di pista. Lasciamolo così com'è.
duellsy,

8
Non importa quale sia il punto della domanda OP che ho posto, quindi non devo creare un nuovo thread e continui a parlare di "perché non" parlarne. Semplicemente non capisco perché qualcuno dovrebbe usare line come l'hai scritto invece di$user = new User; $user->name = 'Neo';
Kyslik

26

L'assegnazione di massa è un processo di invio di una matrice di dati che verranno salvati contemporaneamente nel modello specificato. In generale, non è necessario salvare i dati sul modello uno per uno, ma piuttosto in un singolo processo.

L'assegnazione di massa è buona, ma ci sono alcuni problemi di sicurezza. Che cosa succede se qualcuno passa un valore al modello e senza protezione può sicuramente modificare tutti i campi incluso l'ID. Questo non è buono.

Supponiamo che tu abbia una tabella "studenti", con i campi "tipo_studio, nome_ultimo, nome_ultimo" . Potresti voler assegnare in massa "nome_ultimo, nome_ultimo " ma vuoi proteggere il tipo di studente dalla modifica diretta. È qui che si svolgono i campi compilabili e custoditi .

Fillable ti consente di specificare quali campi sono assegnabili in serie nel tuo modello, puoi farlo aggiungendo la variabile speciale $fillableal modello. Quindi nel modello:

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

" student_type " non sono inclusi, il che significa che sono esentati.

Guarded è il contrario del compilabile. Se compilabile specifica quali campi devono essere assegnati in serie, la protezione specifica quali campi non sono assegnabili in serie. Quindi nel modello:

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

dovresti usare $ fillable o $ guarded - non entrambi.

Per maggiori dettagli apri il link: - Assegnazione di massa


1
Questo è uscito direttamente dal libro di Matt Stauffer "Laravel Up & Running"
frusta

5

L'assegnazione di massa significa che stai riempiendo una riga con più di una colonna usando una matrice di dati. (in qualche modo un collegamento anziché creare manualmente l'array) usando Input::all().

Tecnicamente solo dalla cima della mia testa. Fillable indica quali colonne nella tabella possono essere inserite, mentre la protezione indica che il modello non può essere inserito in quella particolare colonna.

Si noti che quando si tenta di eseguire un'assegnazione di massa con like, inserire in una colonna denominata "segreta" e dopo aver specificato che è protetto, è possibile provare a inserirvi tramite il modello, ma non verrà mai realmente inserito in il database.

Questo è per sicurezza e protezione sul tuo tavolo quando usi il modello. L'assegnazione di massa sembra essere solo un avvertimento o un avvertimento che non hai detto al modello che è compilabile e custodito e lo rende vulnerabile a qualche tipo di attacco.


2

Questo è quando un array di dati ricevuti viene salvato contemporaneamente in un modello.

A causa dei problemi di sicurezza con questo metodo in laravel, si consiglia di definire i campi in cui si desidera popolare i dati richiesti nel modello.

È possibile utilizzare la $fillablevariabile per definire i campi che si desidera popolare nella tabella del database.

Per esempio

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

Quando laravel rileva che stai assegnando i dati in massa, ti costringe a definire i campi che desideri assegnare in massa nella classe del modello.

Qualcuno può facilmente trasferire dati indesiderati in un modulo HTML al tuo database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.