Laravel Guarded vs Fillable: Choosing the Right Approach

By Tim Wassenburg - 17 May, 2023

In Laravel, models serve as a bridge between your application and the database. They define the structure and behavior of your data. When working with models, you often need to specify which attributes can be mass assigned. Laravel provides two options for this: guarded and fillable.

The guarded property is an array that contains attributes that should not be mass assignable. In other words, if you use guarded, you explicitly define which attributes should not be accessible for mass assignment. By default, an empty guarded array means all attributes are mass assignable.

On the other hand, the fillable property is an array that lists the attributes that are allowed for mass assignment. Unlike guarded, when you use fillable, you need to explicitly specify the attributes that can be assigned en masse. Any attributes not included in the fillable array will be guarded.

So, which approach should you choose: guarded or fillable?

The answer depends on your specific use case and security requirements. Here are some considerations to help you decide:

  • Protecting against over-posting: Over-posting, also known as mass assignment vulnerability, occurs when a user includes additional fields in the request that they shouldn't have access to. By using fillable, you explicitly define which fields are allowed for mass assignment, reducing the risk of over-posting attacks.

  • Flexibility vs. strictness: If you have a large number of attributes in your model and you want to allow mass assignment for most of them, using guarded might be more convenient. It allows you to easily guard a few specific attributes while leaving the rest open for mass assignment. On the other hand, if you prefer a strict approach where you only want to allow assignment for explicitly defined attributes, fillable is the way to go.

  • Database migrations and seeding: When using database migrations and seeders, it's often more practical to use fillable. By explicitly specifying the attributes that can be mass assigned, you ensure consistency between your migrations and models.

  • Maintainability: Consider the long-term maintenance of your codebase. Using fillable requires updating the array every time you add or remove attributes in your model. If your model frequently undergoes changes, it can become tedious to manage the fillable array. In such cases, using guarded might be a simpler alternative.

In summary, both guarded and fillable have their merits and should be chosen based on your specific requirements. If you prioritize security and a more explicit approach, fillable is recommended. If flexibility and convenience are more important, guarded might be a better fit.

Ultimately, the choice between guarded and fillable depends on factors such as the level of control you want over mass assignment, the size of your model, and the long-term maintainability of your code. By understanding the differences and making an informed decision, you can ensure the security and integrity of your Laravel applications.