11 abril, 2025
Propiedad $fillable en Laravel
La propiedad $fillable en un modelo de Laravel 12. Si estás empezando con Laravel, este concepto es clave para trabajar con modelos y bases de datos de forma segura

Suscríbete a nuestro canal en Youtube
Suscríbirse¡Hola! Bienvenido a este tutorial sencillo sobre la propiedad $fillable en Laravel 12. Si estás empezando con Laravel, este concepto es clave para trabajar con modelos y bases de datos de manera segura. Vamos a crear un ejemplo de un blog con publicaciones (posts) y un campo is_admin, explicando todo paso a paso para que lo entiendas como principiante. ¡Empecemos!
¿Qué es $fillable?
Definición: La propiedad $fillable es una lista (un arreglo) que pones en un modelo de Laravel para decirle qué campos de la base de datos puede llenar automáticamente desde un formulario. Es como darle permiso a Laravel para guardar ciertos datos, como el título o contenido de una publicación, mientras bloquea otros que no quieres que los usuarios toquen, como un campo de permisos.
Sin $fillable, Laravel no permitirá guardar datos de forma automática para proteger tu aplicación de cambios no deseados. ¡Es una capa de seguridad súper útil!
¿Por qué necesitamos $fillable?
Imagina que tienes un formulario donde los usuarios envían el título y el contenido de una publicación. Laravel necesita saber qué datos son seguros para guardar en la base de datos. Con $fillable, tú decides qué campos permitir, como title y content, y puedes bloquear campos sensibles, como is_admin, para que nadie los modifique desde un formulario.
En este tutorial, usaremos un campo is_admin para mostrar cómo proteger datos importantes mientras permitimos otros.
Paso 1: Crea un modelo con el campo is_admin
Vamos a crear un modelo Post para representar publicaciones en un blog.
-
Crea el modelo y la migración:
En tu terminal, usa este comando para generar el modelo Post con su migración (un archivo que define la tabla en la base de datos):
bash
php artisan make:model Post -m
-
Configura la migración con is_admin:
Abre el archivo de migración en database/migrations (algo como 2023_xx_xx_create_posts_table.php). Edita la función up() para incluir title, content y is_admin:
php
public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('content'); $table->boolean('is_admin')->default(false); // Campo para indicar si es un post de admin $table->timestamps(); }); }
- $table->boolean('is_admin') crea una columna que puede ser true o false.
- default(false) hace que, por defecto, las publicaciones no sean de administradores.
-
Ejecuta la migración:
Corre este comando para crear la tabla:
bash
php artisan migrate
¡Listo! Ahora tienes una tabla posts con id, title, content, is_admin, created_at y updated_at.
Paso 2: Configura $fillable en el modelo
Abre el archivo app/Models/Post.php. Por defecto, está casi vacío. Vamos a agregar $fillable, pero excluiremos is_admin porque no queremos que los usuarios lo cambien desde un formulario.
Edita el modelo así:
php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'title',
'content',
];
}
¿Qué hicimos?
- En $fillable, pusimos title y content. Esto le dice a Laravel que los usuarios pueden enviar estos datos.
- is_admin no está en $fillable, así que Laravel lo ignorará si alguien intenta modificarlo automáticamente. Esto protege el campo de cambios no autorizados.
Paso 3: Crea una publicación desde un controlador
Vamos a crear un controlador para guardar publicaciones y probar qué pasa si alguien intenta enviar is_admin.
-
Crea un controlador:
Usa este comando:
bash
php artisan make:controller PostController
-
Configura el controlador:
Abre app/Http/Controllers/PostController.php y agrega un método store:
php
namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function store(Request $request) { $post = Post::create([ 'title' => $request->input('title'), 'content' => $request->input('content'), 'is_admin' => true, // Intentemos forzarlo ]); return "¡Publicación creada! Es admin: " . ($post->is_admin ? 'Sí' : 'No'); } }
- Post::create() intenta guardar los datos.
- Incluimos is_admin => true para simular un intento de cambiarlo desde un formulario. Veremos cómo $fillable lo bloquea.
-
Crea una ruta:
Abre routes/web.php y agrega:
php
use App\Http\Controllers\PostController;
Route::post('/posts', [PostController::class, 'store']);
Paso 4: Prueba $fillable con is_admin
Usemos Tinker para ver cómo funciona $fillable.
-
Abre la terminal y ejecuta:
bash
php artisan tinker
-
Crea una publicación:
php
$data = ['title' => 'Mi post', 'content' => '¡Hola, mundo!', 'is_admin' => true]; App\Models\Post::create($data);
-
Verifica el resultado:
En Tinker, usa:
php
App\Models\Post::latest()->first();
Verás algo como:
text
=> App\Models\Post {#1234 id: 1, title: "Mi post", content: "¡Hola, mundo!", is_admin: 0, // ¡Sigue en false! created_at: "2025-04-10 10:00:00", updated_at: "2025-04-10 10:00:00", }
Aunque intentamos poner is_admin como true, se quedó en false porque no está en $fillable. ¡Esa es la magia de la seguridad de Laravel!
Paso 5: Asigna is_admin manualmente
Campos como is_admin no deberían depender de un formulario. Vamos a modificar el controlador para asignar is_admin solo si el usuario autenticado es administrador.
Actualiza el método store en PostController.php:
php
public function store(Request $request)
{
$post = new Post();
$post->title = $request->input('title');
$post->content = $request->input('content');
// Solo asignamos is_admin si el usuario es admin
if (auth()->check() && auth()->user()->is_admin) { // Suponiendo que users tiene is_admin
$post->is_admin = true;
}
$post->save();
return "¡Publicación creada! Es admin: " . ($post->is_admin ? 'Sí' : 'No');
}
- Usamos new Post() y asignamos los campos manualmente.
- is_admin solo se pone en true si el usuario autenticado es administrador, no por lo que envíe el formulario.
Paso 6: ¿Qué pasa si no usas $fillable?
Para entender por qué $fillable es importante, elimina $fillable del modelo o déjalo vacío (protected $fillable = [];). Luego, en Tucker, intenta:
php
App\Models\Post::create(['title' => 'Test', 'content' => 'Sin fillable']);
Verás un error como:
text
Illuminate\Database\Eloquent\MassAssignmentException: Add [title] to fillable property to allow mass assignment on [App\Models\Post].
Sin $fillable, Laravel bloquea todo para protegerte. Imagina si is_admin estuviera permitido sin control: ¡cualquiera podría hacerse administrador! Por eso $fillable es esencial.
Consejos para principiantes
-
Solo pon en $fillable lo que los usuarios deben cambiar: Incluye title y content, pero nunca is_admin o id.
-
Protege campos sensibles: Campos como is_admin deben manejarse en el código, no en formularios.
-
Valida los datos: Antes de guardar, verifica los datos en el controlador:
php
$request->validate([ 'title' => 'required|max:255', 'content' => 'required', ]);
-
Usa Tinker para practicar: Prueba en Tinker:
php
App\Models\Post::create(['title' => 'Trampa', 'content' => 'Ja ja', 'is_admin' => 1]);
Verás que is_admin no cambia.
-
Alternativa: $guarded: Puedes usar $guarded para bloquear campos:
php
protected $guarded = ['is_admin', 'id'];
Pero $fillable es más fácil para empezar.
Resumen
- $fillable es una lista en tu modelo que permite a Laravel llenar ciertos campos automáticamente desde formularios.
- Protege campos como is_admin dejándolos fuera de $fillable.
- Usa $fillable para title y content, y asigna is_admin manualmente según la lógica de tu app.
- Sin $fillable, Laravel bloquea todo por seguridad.
Leido 817 veces | 2 usuarios
Descarga del código fuente Laravel de Propiedad $fillable en Laravel
Accede al código fuente esencial de nuestra aplicación en formato ZIP ó TXT. Ideal para desarrolladores que desean personalizar o integrar nuestra solución.
Opciones de descarga
- Usuarios Registrados: Inicia sesión para descarga inmediata.
- Nuevos Usuarios: Regístrate y descarga.