Configura tu proyecto
Los valores committeados que hacen tuyo el kit, y las banderas que deciden qué funciones opcionales existen.
La configuración vive en dos lugares. Lo que cambia entre máquinas es una variable de entorno, se lee de .env y está cubierto en El archivo de entorno. Lo que pertenece al producto es un valor committeado en config/ y viaja con el repositorio. Esta guía cubre los valores committeados que un desarrollador cambia cuando arranca un proyecto, las variables de entorno que leen, y cada bandera con exactamente lo que apaga.
Nombre, inicio y clave del proyecto
Clave en config/app.php |
Valor | Qué hace |
|---|---|---|
name |
env('APP_NAME', 'Laravel') |
El título del navegador, el texto alternativo del logotipo y el nombre del remitente del correo a través de MAIL_FROM_NAME="${APP_NAME}". Pon APP_NAME en .env. |
home_route |
/app |
A dónde llega una persona después de iniciar sesión, registrarse, verificar su correo, restablecer o confirmar una contraseña, abrir /home, y a dónde vuelve un administrador cuando deja de suplantar a alguien. Cámbialo cuando tu área autenticada viva en otro lugar. |
project |
weblabor-base |
La carpeta bajo docs/ que guarda tus guías y tu changelog y la carpeta bajo resources/views/landing/ que guarda tu landing y tus páginas de características. Cámbiala una vez, cuando arranca el proyecto. Revisa Hazlo tuyo. |
Logotipo e icono
'logo' => 'images/logo.svg',
'icon' => 'images/icon.svg',
Ambas son rutas dentro de public/, resueltas con asset(). El logotipo es la imagen ancha del encabezado del layout de la aplicación. El icono es la cuadrada: el favicon, la imagen sobre las pantallas de inicio de sesión, registro, verificación y contraseña, el encabezado compacto en pantallas pequeñas, la imagen de una notificación en el centro de notificaciones y en un web push, y la imagen base que php artisan pwa:generate-assets propone cuando genera los iconos y las pantallas de carga de la PWA. Reemplaza los dos archivos o apunta las claves a los tuyos.
Administradores y cuentas sembradas
'sudo' => [
'[email protected]',
],
'default_users' => [
'[email protected]',
],
php artisan db:seed lee ambas listas. Por cada correo de cualquiera de ellas crea la cuenta cuando todavía no existe, incluyendo una borrada con soft delete:
- El nombre es la parte antes de la
@, en mayúsculas iniciales:[email protected]esAdmin. - El correo queda verificado al instante, así que la cuenta inicia sesión sin código.
- La contraseña es la parte antes de la
@al revés:[email protected]inicia sesión connimda.
La lista sudo hace dos cosas más. El seeder da a cada una de esas cuentas el rol que nombra admin_role, y cuando la contraseña sigue siendo la generada marca la cuenta para que el siguiente inicio de sesión la mande a cambiarla antes de llegar a cualquier otra cosa. La lista también define quién es superadministrador en tiempo de ejecución: $user->sudo es verdadero para cualquier cuenta cuyo correo esté en ella, lo que abre la DevZone en /admin/dev, permite leer el registro de actividad y evita que otros administradores borren la cuenta. Revisa Sudo y superadministradores.
default_users no recibe rol ni cambio forzado de contraseña. Úsala para las cuentas de prueba que quieres en cada entorno que siembras.
La lista está committeada, así que pon tu propio correo ahí antes del primer seed y deja [email protected] fuera de producción.
Banderas de funciones
config/features.php decide qué partes opcionales del producto existen. Cada bandera lee una variable de entorno y su valor por omisión es false, así que un .env recién creado las tiene todas apagadas. Enciende una escribiendo la variable:
FEATURE_ANNOUNCEMENTS=true
FEATURE_PLANS_ENABLED=true
FEATURE_ADDONS_ENABLED=true
FEATURE_TRACKING_ENABLED=true
FEATURE_REFERRALS_ENABLED=true
FEATURE_TICKETS_ENABLED=true
FEATURE_CHAT_ENABLED=true
FEATURE_ASSISTANT_ENABLED=true
.env.example sólo lista FEATURE_PLANS_ENABLED, FEATURE_ADDONS_ENABLED, FEATURE_TICKETS_ENABLED y FEATURE_CHAT_ENABLED; agrega las demás tú mismo.
| Clave | Variable de entorno | Apagada en el sitio público y la cuenta | Apagada en el panel de administración |
|---|---|---|---|
announcements |
FEATURE_ANNOUNCEMENTS |
El desplegable del megáfono desaparece del encabezado, la entrada Avisos desaparece de la barra lateral de la cuenta, y /account/announcements y cada página de aviso responden 404. |
El recurso Avisos desaparece del menú y sus páginas responden 403: su política niega toda acción. |
plans_enabled |
FEATURE_PLANS_ENABLED |
"Mis planes" desaparece de la barra lateral de la cuenta y /account/plans responde 403. La revisión de suscripción en /app deja pasar a todos, porque no hay plan activo. La suscripción automática al plan gratuito al registrarse no hace nada. |
El recurso Planes desaparece del menú, las métricas de cobro desaparecen del dashboard, y la sincronización diaria de tipos de cambio no se programa a menos que los complementos estén encendidos. El recurso además necesita STRIPE_SECRET para aparecer. |
addons_enabled |
FEATURE_ADDONS_ENABLED |
/account/add-ons y cada página de detalle de complemento responden 404, y el catálogo de complementos no se ofrece en la página de planes. |
Los recursos Complementos y Medidores desaparecen del menú y sus páginas responden 403. |
tracking_enabled |
FEATURE_TRACKING_ENABLED |
Nada visible cambia. No se crea sesión de seguimiento para una visita, toda llamada a trackingEvent() se ignora, y nada se envía a la Conversions API de Facebook aunque FACEBOOK_ACCESS_TOKEN y FACEBOOK_PIXEL_ID estén puestos. |
Tipos de evento, Sesiones y Eventos de seguimiento desaparecen del menú y responden 403, las dos pestañas de seguimiento desaparecen del detalle de un usuario, y "Eventos de seguimiento" desaparece de las métricas del dashboard. |
referrals.enabled |
FEATURE_REFERRALS_ENABLED |
La entrada Referidos desaparece de la barra lateral de la cuenta y /account/referrals responde 404. Un ?referrer=CODIGO en una URL se ignora, no se registra ningún referido al registrarse y nunca se crea una recompensa. |
"Suscripciones por referido" desaparece de las métricas del dashboard. No hay recurso de administración para referidos. |
tickets.enabled |
FEATURE_TICKETS_ENABLED |
La entrada Tickets desaparece de la barra lateral de la cuenta, la tarjeta Tickets desaparece del centro de ayuda, cada página de tickets responde 404 y la guía «Tickets de soporte» se oculta. Los tickets ya guardados se conservan. | La entrada Bandeja de soporte desaparece de la barra lateral y responde 404, el permiso Contestar ticket desaparece del editor de roles y el interruptor Soporte prioritario desaparece del formulario del plan salvo que el chat esté encendido, y los comandos programados de tickets no hacen nada. El flujo está en la guía «Tickets de soporte», disponible mientras los tickets están encendidos. |
chat.enabled |
FEATURE_CHAT_ENABLED (o la anterior FEATURE_TICKETS_CHAT_ENABLED) |
Independiente de los tickets; un chat solo comienza con el tiempo real corriendo. Apagada, la tarjeta Chat desaparece del centro de ayuda, la entrada Chat desaparece de la barra lateral de la cuenta y cada página de chat responde 404. | La entrada Chats desaparece de las barras laterales de soporte, de la cuenta y de administración. El flujo está en la guía «Chat de soporte en vivo», disponible mientras el chat está encendido. |
assistant.enabled |
FEATURE_ASSISTANT_ENABLED |
Nada de lo que ve un cliente cambia: el asistente es una pantalla del equipo de soporte. | Apagada, la entrada Asistente desaparece del grupo Soporte del menú del panel de administración, /admin/support/assistant responde 404 y el permiso Usar asistente desaparece del editor de roles. Encendida, la pantalla abre para un rol con Usar asistente, y dice que el asistente no está disponible mientras falte ANTHROPIC_API_KEY. |
El menú de administración oculta un recurso cuando su política niega viewAny, y todas las políticas de arriba niegan todo mientras su bandera está apagada. Por eso una sección que no ves tampoco se alcanza escribiendo su URL.
Las subclaves de referidos
El arreglo referrals lleva los números del programa además de su interruptor. El flujo está en Referidos.
| Clave | Variable de entorno | Valor por omisión | Qué hace |
|---|---|---|---|
referrals.enabled |
FEATURE_REFERRALS_ENABLED |
false |
El interruptor descrito arriba. |
referrals.registration_reward |
FEATURE_REFERRALS_REGISTRATION_REWARD |
10 |
Monto abonado a quien refiere cuando una persona referida se registra. 0 no crea recompensa de registro. |
referrals.subscription_reward_percent |
FEATURE_REFERRALS_SUBSCRIPTION_REWARD_PERCENT |
10 |
Porcentaje de cada factura de suscripción pagada por una persona referida que se abona a quien la refirió. 0 no crea recompensa de suscripción. |
referrals.currency |
FEATURE_REFERRALS_CURRENCY |
mxn |
Moneda de la recompensa de registro, y de una recompensa de suscripción cuando la factura de Stripe no trae moneda. Código ISO en minúsculas. |
referrals.cookie_days |
FEATURE_REFERRALS_COOKIE_DAYS |
30 |
Días que el código de quien refiere permanece en la cookie del visitante después de llegar con ?referrer=CODIGO. Un valor menor a 1 se lee como 1. |
Las subclaves del asistente
El arreglo assistant lleva los ajustes del asistente de soporte además de su interruptor. El asistente siempre habla con Anthropic usando ANTHROPIC_API_KEY, y contesta en la cola, así que tiene que haber un worker corriendo. Su pantalla se describe en la guía «Asistente de soporte».
| Clave | Variable de entorno | Valor por omisión | Qué hace |
|---|---|---|---|
assistant.enabled |
FEATURE_ASSISTANT_ENABLED |
false |
El interruptor descrito arriba. |
assistant.model |
FEATURE_ASSISTANT_MODEL |
claude-sonnet-5-5 |
El modelo de Claude que contesta. |
assistant.max_steps |
FEATURE_ASSISTANT_MAX_STEPS |
12 |
Llamadas a Claude que una respuesta puede hacer antes de tener que contestar con lo que encontró. Un valor menor a 1 se lee como 1. |
assistant.worker_wait_seconds |
FEATURE_ASSISTANT_WORKER_WAIT_SECONDS |
30 |
Segundos que una pregunta espera a un worker de la cola antes de que el asistente diga que nadie está contestando. |
assistant.database.username, assistant.database.password |
FEATURE_ASSISTANT_DB_USERNAME, FEATURE_ASSISTANT_DB_PASSWORD |
vacío | Un usuario de base de datos con permisos de solo lectura, que las consultas del asistente usan en lugar del de la aplicación cuando está puesto. |
La trampa del despliegue
Como toda bandera está apagada por omisión, una sección que funciona en tu máquina y falta en el servidor es casi siempre una variable que nunca se escribió en el .env del servidor. El síntoma es silencioso: no hay error, la entrada del menú simplemente no está. Escribe las banderas también en el servidor y limpia la caché de configuración después de cambiarlas. Revisa Despliega tu proyecto.
El resto de config/app.php
| Clave | Valor | Qué hace |
|---|---|---|
timezone |
UTC |
La zona horaria en que se guardan las fechas, y la que ve un visitante sin cuenta. Déjala en UTC; cada cuenta tiene la suya. Revisa Zonas horarias y fechas. |
locale |
env('APP_LOCALE', 'es') |
El idioma fuera de una petición web: comandos de consola, trabajos en cola y rutas de API. Las peticiones web resuelven su propio idioma y nunca lo leen. |
languages |
['es' => 'Spanish', 'en' => 'English'] |
Los idiomas a los que un visitante puede cambiar y que una cuenta puede elegir. |
fallback_locale |
es |
El idioma cuando nada más decide, y al que cae una traducción que falta. Revisa Idiomas y traducciones. |
pwa |
env('APP_PWA', false) |
Enciende el service worker y el comportamiento de PWA. Revisa Web push y la PWA. |
country_code_fallback |
env('COUNTRY_CODE_FALLBACK', 'US') |
El país que se asume cuando la IP del visitante es privada, que es toda petición en desarrollo local. Revisa Detecta el país del visitante. |
Las claves de permisos deciden qué genera php artisan db:seed para el panel de administración. El flujo completo está en Roles y permisos.
| Clave | Valor por omisión | Qué hace |
|---|---|---|
discover_front_permissions |
true |
Genera los permisos create, retrieve, update y delete para cada recurso de administración que tiene modelo, cada uno solo cuando el recurso ofrece esa acción, nombrados con el singular de la tabla del modelo (delete announcement). |
allow_permisisons_deletion |
true |
Borra con soft delete los permisos que ya no se generan ni se listan. La clave se escribe exactamente así en el archivo y en el seeder. |
permissions |
once entradas | Permisos extra como 'nombre del permiso' => 'web'. Viene con los de la biblioteca de medios (retrieve, create, update y delete media; retrieve, create, update, delete y browse media_folder), answer ticket y use assistant. |
admin_role |
admin |
El rol que recibe todos los permisos y se asigna a las cuentas sudo. |
default_role |
null |
Un rol creado al sembrar, por ejemplo 'default'. null no crea ninguno. Nada lo asigna a una cuenta: el registro da a cada cuenta nueva el rol client, que el seeder siempre crea. Un rol nombrado aquí no se puede borrar desde el panel. |
default_role_permissions |
[] |
Permisos que recibe default_role la primera vez que se crea. |
Los valores committeados de config/pricing.php
Importan una vez que FEATURE_PLANS_ENABLED o FEATURE_ADDONS_ENABLED está encendida. Cómo usarlos está en Crea y da precio a un plan y en Pruebas gratuitas y cupones.
| Clave | Variable de entorno | Valor por omisión | Qué hace |
|---|---|---|---|
primary_currency |
ninguna | mxn |
La moneda a la que se convierten los ingresos en el dashboard de administración y la base de las instantáneas diarias de tipo de cambio. Cámbiala en el archivo. |
exchange_rates.provider |
ninguna | frankfurter |
El proveedor de tipos de cambio. frankfurter es el único que el kit implementa. |
exchange_rates.endpoint |
ninguna | https://api.frankfurter.app |
De dónde se obtienen los tipos de cambio. |
exchange_rates.timeout |
ninguna | 10 |
Segundos de espera al proveedor. |
coupons.enabled |
BILLING_COUPONS_ENABLED |
true |
Muestra el campo de código promocional en Stripe Checkout. Los códigos se crean en el dashboard de Stripe. |
freeTrial.enabled |
BILLING_FREE_TRIAL_ENABLED |
false |
Da a una cuenta un periodo de prueba la primera vez que pasa a un plan de pago. |
freeTrial.days |
BILLING_FREE_TRIAL_DAYS |
14 |
Duración de ese periodo. |
intervals |
ninguna | monthly, yearly |
Las frecuencias de cobro que un precio puede tener. Cada entrada tiene interval (month o year), label, count (intervalos por ciclo) y active. Agregar una agrega una columna al formulario de precios del panel. |
Los tipos de cambio los obtiene php artisan billing:sync-exchange-rates, programado a diario a las 12:00 mientras los planes o los complementos están encendidos, para las fechas que tuvieron una suscripción pagada en una moneda distinta de la principal.