Mnemo

Laravel — Entrevista

Fuente: Guía de estudio Laravel+Vue (proyecto Supermercado DDD)

35 tarjetas35 vencidas ahora0 ya repasadas

laravelphpbackend

Tarjetas

¿Qué es el Service Container?

El contenedor de dependencias de Laravel. Sabe cómo construir objetos y resolver sus dependencias. Se configuran los bindings en los Service Providers.

¿bind vs singleton?

`bind` crea una nueva instancia cada vez. `singleton` reutiliza la misma. Usar singleton para servicios sin estado (Clock, PaymentGateway).

¿Qué es $fillable?

Lista blanca de campos asignables masivamente. Previene mass-assignment (que alguien envíe `is_admin=1`).

¿Middleware vs Policy?

Middleware protege RUTAS (requiere auth). Policy protege RECURSOS (puede este user editar ESTE modelo).

¿Qué hace el cast hashed?

Hashea el password con bcrypt al asignarlo. Garantiza que nunca se guarde en texto plano.

¿Events vs llamar directamente al listener?

Desacoplamiento. El emisor no sabe quién escucha. Permite agregar listeners sin tocar el emisor.

¿Facades vs DI?

Facades: concisos pero ocultan dependencias. DI: explícito, mejor para testing. Ambos válidos en Laravel.

¿Qué es el middleware?

Capas que interceptan el request antes del controller. Sirve para auth, CORS, CSRF, logging. Desacopla concerns transversales.

¿Qué son los Service Providers?

El lugar donde se configuran bindings del container, listeners de eventos y cualquier setup. `register()` para bindings, `boot()` para lo que necesita todo cargado.

¿Qué es Eloquent?

El ORM de Laravel. Mapea tablas a objetos PHP. Provee query builder, relationships, scopes, casts.

¿Cómo defines una ruta con parámetro?

`Route::get('/producto/{id}', [Controller, 'metodo'])`. Después lo recibes como argumento del método.

¿Cómo funciona Auth::attempt?

Busca usuario por email, verifica password con bcrypt, guarda el ID en sesión. Retorna true/false.

¿Qué hace back()->withErrors()?

Redirige a la página anterior (back) con errores en la sesión. Se usan para mostrar mensajes de validación.

¿RefreshDatabase vs DatabaseTransactions?

`RefreshDatabase` migra + rollback por test (limpio, lento). `DatabaseTransactions` solo rollback (rápido).

¿firstOrCreate vs create?

`firstOrCreate` busca por atributos y solo crea si no existe (idempotente). `create` siempre crea uno nuevo.

¿Qué ganás al agrupar rutas con middleware en un grupo?

Aplicás middleware compartido (auth, throttle) a un bloque entero de rutas, con prefijos de URL y nombre comunes. Una sola declaración protege todo el grupo.

¿Form Request vs validar inline en el controller?

El Form Request mueve validación y autorización a una clase propia, testeable y reutilizable; el controller queda solo con orquestar. Inline vale para reglas triviales de uno o dos campos.

¿Cuándo usar una LazyCollection?

Cuando procesás decenas de miles de filas en batch: recorre los resultados con un solo cursor de BD y mantiene la memoria constante. La Collection normal materializa todo en RAM.

¿Global scope vs Local scope?

El global se aplica a TODAS las queries del modelo automáticamente (se registra en `boot`). El local se aplica solo cuando lo invocás explícitamente: `User::active()`.

¿Qué problema resuelve el eager loading?

El problema N+1: 1 query trae los padres y luego N queries, una por fila, al iterar la relación. Con `with()` todo se resuelve en 2 queries.

¿Queue asíncrona vs QUEUE_CONNECTION=sync?

Async: el job se encola, el request responde de inmediato y un worker lo procesa después. Sync: el job ejecuta EN LÍNEA dentro del request — determinístico, ideal para tests y dev.

¿Qué pasa cuando un job de cola falla?

Se reintenta según `$tries` con `$backoff` entre intentos; agotados los intentos queda registrado en la tabla `failed_jobs`, desde donde podés inspeccionarlo y reintentarlo.

¿Accessor vs Cast?

El cast transforma el valor ALMACENADO de forma declarativa en `$casts` (string JSON → array) y funciona en ambos sentidos. El accessor transforma solo al leer, con lógica arbitraria en PHP.

¿Cuándo corresponde una relación polimórfica?

Cuando muchos modelos distintos pueden poseer el mismo tipo de hijo: comentarios en posts Y videos, fotos en users Y productos. Una sola tabla con `commentable_type`/`commentable_id`.

¿Notification vs Mailable?

Notification es multi-canal (mail, database, Slack, broadcast) con una plantilla por canal. Mailable es solo email, con control total del mensaje.

¿Qué patrón implementa Cache::remember?

Cache-aside: si la clave existe la devuelve; si no, ejecuta el closure, guarda el resultado con TTL y lo devuelve. El closure solo corre en el miss.

¿Por qué un scheduler en vez de un cron por tarea?

Definís todas las tareas en código (`routes/console.php`) y el SO solo dispara UNA entrada: `schedule:run` cada minuto. La configuración queda versionada en el repo.

¿API Resource vs devolver el modelo Eloquent directo?

El Resource declara EXPLÍCITAMENTE qué campos exponer y cómo anidar relaciones: un contrato de API estable. El modelo directo acopla tu respuesta al schema de la tabla.

¿Gates vs Policies?

Gate: closure suelto para una habilidad puntual, no ligada a un modelo. Policy: clase agrupada POR modelo con un método por acción (view, create, update, delete).

¿Cómo protegés un endpoint de abuso?

Rate limiting con throttle: definís límites por minuto (por IP o user) en un RateLimiter y aplicás el middleware `throttle:` a la ruta o grupo.

¿Cuándo usar un Observer?

Para agrupar en una clase las reacciones al ciclo de vida de UN modelo (created, updated, deleted): invalidar caché, loggear, disparar side-effects.

¿Soft delete vs delete real?

Soft delete: escribe `deleted_at` y el registro desaparece de las queries por defecto (recuperable). Delete real: `forceDelete()` elimina la fila de la tabla.

¿Qué garantiza DB::transaction?

Atomicidad: si el bloque lanza una excepción, se hace rollback de TODOS los writes y la base queda como antes. Sin transacción, quedan escrituras a medias.

¿Por qué factories en vez de crear modelos a mano en tests?

La factory crea registros válidos con defaults realistas (Faker) y cada test solo sobreescribe los campos que le importan. A mano, cada test duplica el conocimiento de qué necesita la tabla.

¿Offset vs Cursor pagination?

Offset (`paginate`) salta N filas: permite ir a cualquier página pero se degrada en páginas profundas. Cursor (`cursorPaginate`) pide "lo posterior a este ID": rápido y estable, sin números de página.