Inicio » Blog »

11 abril, 2025

Propiedad $fillable en Laravel

#Laravel #PHP

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

Propiedad $fillable en Laravel

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.

  1. 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
  2. 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.
  3. 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.

  1. Crea un controlador:

    Usa este comando:

    bash

    php artisan make:controller PostController
  2. 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.
  3. 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.

  1. Abre la terminal y ejecuta:

    bash

    php artisan tinker
  2. Crea una publicación:

    php

    $data = ['title' => 'Mi post', 'content' => '¡Hola, mundo!', 'is_admin' => true]; App\Models\Post::create($data);
  3. 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

  1. Solo pon en $fillable lo que los usuarios deben cambiar: Incluye title y content, pero nunca is_admin o id.

  2. Protege campos sensibles: Campos como is_admin deben manejarse en el código, no en formularios.

  3. Valida los datos: Antes de guardar, verifica los datos en el controlador:

    php

    $request->validate([
        'title' => 'required|max:255',
        'content' => 'required',
    ]);
  4. 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.

  5. 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.

2 descargas

Para descargar el código inicia sesión o crea una cuenta

Iniciar Sesión

Compartir link del tutorial con tus amigos

Test : Uso de fillable en Laravel

..

1. ¿Qué comando de Artisan se utiliza para generar un componente Blade en Laravel?

2. ¿En qué archivo se define la lógica del componente de alerta creado en el tutorial?

3. ¿Qué parámetros acepta el constructor de la clase Alert en el ejemplo?

4. ¿Dónde se escribe el diseño HTML del componente de alerta?

5. ¿Qué framework CSS se usa en el tutorial para estilizar el componente de alerta?

6. ¿Cómo se invoca el componente de alerta en una vista usando atributos?

7. ¿Qué se utiliza en la vista del componente para manejar contenido interno dinámico?

8. ¿Qué ventaja principal ofrecen los componentes Blade según el tutorial?

9. ¿Cómo se aplica un estilo diferente según el tipo de alerta en el diseño del componente?

10. ¿Qué método de la clase Alert devuelve la vista del componente?


Laravel Página Web Administrable

USD 37.00

Descarga del código fuente

Laravel Página Web Administrable

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú