O que significa "Atribuição em Massa" no Laravel?

159

Ao ler o documento do Laravel sobre a parte do tópico Eloquent ORM, recebi um novo termo Mass Assignment.

Documento show Como executar a atribuição em massa e as configurações fillableou guardedpropriedades. Mas depois de passar por isso, eu não entendi claramente sobreMass Assignment e como funciona.

Na minha experiência anterior no CodeIgniter, também não ouvi falar desse termo.

Alguém tem uma explicação simples sobre isso?

Chen-Tsu Lin
fonte

Respostas:

206

A atribuição em massa é quando você envia uma matriz para a criação do modelo, basicamente configurando vários campos no modelo de uma só vez, em vez de um por um, algo como:

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

(Em vez de definir explicitamente cada valor no modelo separadamente.)

Você pode usar fillablepara proteger quais campos você deseja que isso permita a atualização.

Você também pode impedir que todos os campos sejam atribuíveis em massa, fazendo o seguinte:

protected $guarded = ['*'];

Digamos que na sua tabela de usuários você tenha um campo que seja user_typee que possa ter valores de user / admin

Obviamente, você não deseja que os usuários possam atualizar esse valor. Em teoria, se você usasse o código acima, alguém poderia injetar em um formulário um novo campo user_typee enviar 'admin' junto com os outros dados do formulário, e facilmente mudar a conta deles para uma conta de administrador ... más notícias.

Adicionando:

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

Você está garantindo que apenas esses valores possam ser atualizados usando mass assignment

Para poder atualizar o user_typevalor, você precisa defini-lo explicitamente no modelo e salvá-lo, assim:

$user->user_type = 'admin';
$user->save();
duellsy
fonte
16
Obrigado por esta resposta, eu não entendo quem faria algo como $user = new User(Input::all());(como programador) que é tão descontrolado (ou em que cenário seria útil).
21414 Kyslik
14
... não é de todo o ponto da resposta, é para manter a resposta curta, sem seqüestro-lo como uma lição toda a segurança etc
duellsy
3
Entendi o argumento e estou feliz por ter encontrado essa resposta. Estou apenas curioso em qual cenário a linha citada acima (no meu comentário) é útil. Quero dizer, sem validação e todas essas coisas ao redor.
Kyslik
4
então você pensa em resposta a uma pergunta intitulada 'O que significa' Missa em massa 'no Laravel?' Eu deveria ter entrado em detalhes sobre validação ... era uma resposta simples para a pergunta sem sair da pista. Vamos deixar isso como está.
duellsy 31/07
8
Não importa qual é o ponto da pergunta do OP que eu fiz, então não preciso criar um novo thread, e você continua falando sobre "por que não" falar sobre isso. Eu simplesmente não entendo por que alguém iria usar a linha que você escreveu ele em vez de$user = new User; $user->name = 'Neo';
Kyslik
26

A atribuição em massa é um processo de envio de uma matriz de dados que serão salvos no modelo especificado de uma só vez. Em geral, você não precisa salvar os dados no seu modelo individualmente, mas em um único processo.

A atribuição em massa é boa, mas há alguns problemas de segurança por trás disso. E se alguém passa um valor para o modelo e sem proteção, ele pode definitivamente modificar todos os campos, incluindo o ID. Isso não é bom.

Vamos dizer que você tem a tabela 'estudantes', com campos "student_type, first_name, last_name” . Você pode querer atribuir massa 'first_name, last_name', mas que pretende proteger student_type de ser alterado diretamente. É aí que fillable e vigiado ter lugar.

Preenchível permite especificar quais campos são atribuíveis em massa no seu modelo. Você pode fazê-lo adicionando a variável especial $fillableao modelo. Então, no modelo:

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

o ' student_type ' não está incluído, o que significa que eles estão isentos.

Guardado é o inverso do preenchível. Se preenchível especificar quais campos serão atribuídos em massa, guardado especifica quais campos não são atribuíveis em massa. Então, no modelo:

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

você deve usar $ fillable ou $ guarded - não os dois.

Para mais detalhes, acesse o link: - Atribuição em massa

Udhav Sarvaiya
fonte
1
Isso foi retirado do livro de Matt Stauffer "Laravel Up & Running"
bata
5

Atribuição em massa significa que você está preenchendo uma linha com mais de uma coluna usando uma matriz de dados. (um pouco de um atalho em vez de criar manualmente a matriz) usando Input::all().

Tecnicamente, apenas do topo da minha cabeça. Preenchível significa que colunas da tabela podem ser inseridas, protegido significa que o modelo não pode inserir nessa coluna específica.

Observe que quando você tenta fazer uma atribuição em massa com like, insere em uma coluna chamada "segredo" e especifica que ela é protegida, você pode tentar inseri-la através do modelo, mas ela nunca será realmente inserida em o banco de dados.

Isso é para segurança e proteção na sua mesa ao usar o modelo. A atribuição em massa parece ser apenas um aviso ou aviso de que você não disse ao modelo quais são preenchíveis e protegidos e o torna vulnerável a algum tipo de ataque.

majidarif
fonte
2

É quando uma matriz de dados recebidos é salva ao mesmo tempo em um modelo.

Devido aos problemas de segurança com esse método no laravel, é recomendável definir os campos que você deseja que os dados solicitados preencham no Modelo.

Você pode usar a $fillablevariável para definir os campos que deseja preencher na tabela do banco de dados.

Por exemplo

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

Quando o laravel detecta que você está atribuindo dados em massa, ele o força a definir os campos que deseja atribuir em massa na classe de modelo.

Alguém pode facilmente passar dados indesejados para um formulário html no seu banco de dados.

Punit khandelwal
fonte