> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Añadir información de diagnóstico del paquete a about

> Aprende a usar AboutCommand de Laravel 13 para mostrar el estado de configuración de tu paquete en la CLI y en JSON, junto con el momento de evaluación y las precauciones para el mantenimiento a largo plazo.

Cuando un usuario te hace una consulta, conviene poder comprobar con un formato uniforme si el paquete está activado y qué driver está seleccionado. Con `AboutCommand::add()` puedes añadir una sección para tu paquete a la salida de `php artisan about` sin implementar un comando específico.

La documentación oficial incluye un ejemplo básico de registro. Esta página revisa además la implementación de Laravel 13 y profundiza en el momento en que se recopila la información, los tipos en JSON, las colisiones de nombres de sección y el estado del registro en las pruebas.

## Registrar el contenido mostrado en el provider

El siguiente ejemplo supone que `courier.enabled` y `courier.driver` ya están registrados como configuración del paquete. Para saber cómo registrar la configuración, consulta [Fusión y caché de la configuración de paquetes](/es/advanced/package-config-merging).

```php theme={null}
<?php

namespace Acme\Courier;

use Illuminate\Foundation\Console\AboutCommand;
use Illuminate\Support\ServiceProvider;

class CourierServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        if (! $this->app->runningInConsole()) {
            return;
        }

        AboutCommand::add('Acme Courier', fn () => [
            'Enabled' => AboutCommand::format(
                (bool) config('courier.enabled', false),
                console: fn (bool $enabled) => $enabled ? 'ENABLED' : 'OFF',
            ),
            'Driver' => (string) config('courier.driver', 'log'),
        ]);
    }
}
```

`runningInConsole()` es una condición que evita registros innecesarios en las peticiones HTTP. No detecta únicamente la ejecución de `about`, por lo que el registro también se produce con otros comandos de Artisan. Sin embargo, las lecturas de configuración dentro de la closure anterior no se ejecutan en el momento del registro.

<Warning>
  Elige de forma explícita los elementos que se muestran. No muestres claves de API, tokens de acceso, URLs de conexión que contengan credenciales ni arrays de configuración completos. La salida JSON tampoco enmascara automáticamente la información secreta. Cuando atiendas consultas, pide que se comparta solo la sección de tu paquete y que se revise su contenido antes de compartirla.
</Warning>

## Separar el momento del registro del momento de la evaluación

En Laravel `v13.35.0`, `add()` no recopila los datos en ese instante, sino que añade una closure de registro al estático `$customDataResolvers`. Al ejecutar `about`, se construyen los datos que se van a mostrar y se evalúan las closures de obtención de datos registradas.

```mermaid theme={null}
flowchart TD
    A["boot() del provider"] --> B["add() guarda el registro"]
    B --> C["Ejecutar about"]
    C --> D["Recopilar la información estándar y las secciones añadidas"]
    D --> E["Evaluar las closures de obtención de datos"]
    E --> F["Filtrar secciones con --only"]
    F --> G["Mostrar en CLI o JSON"]
```

Obtener los valores de configuración dentro de la closure refleja mejor el estado en el momento de ejecutar el comando que leerlos antes, fuera de `add()`, y fijarlos en un array. Por otro lado, el filtro `--only` se aplica **después** de evaluar las closures de obtención de datos.

```bash theme={null}
php artisan about --only=environment
```

Aunque indiques solo una sección estándar como en este caso, la closure de `Acme Courier` anterior se evalúa igualmente. Que algo no se muestre no significa que no se procese.

Por eso, obtén la información adicional a partir de valores de configuración o de un estado local ligero. Si incluyes comprobaciones de conectividad con APIs externas, consultas a la base de datos o modificaciones de archivos, incluso los comandos que consultan secciones no relacionadas pueden volverse lentos o fallar. Separa las comprobaciones de conectividad y las reparaciones en comandos de Artisan específicos.

<Tip>
  La condición `runningInConsole()` por sí sola no garantiza que se ejecute el `boot()` de un service provider diferido. Si quieres que la información de diagnóstico se registre siempre, coloca ese registro en un provider de carga inmediata. Para configuraciones en las que solo se difieren los bindings de servicios, consulta [Service providers diferidos](/es/advanced/deferred-provider).
</Tip>

## Compatibilizar la visualización en CLI con los tipos de JSON

Para consultar solo la información de tu paquete, indica el nombre de la sección convertido a snake case en minúsculas. En el caso de `Acme Courier`, es `acme_courier`.

```bash theme={null}
php artisan about --only=acme_courier
php artisan about --only=environment,acme_courier
php artisan about --only=acme_courier --json
```

Con el ejemplo de registro anterior, cuando `courier.enabled` es `true` y `courier.driver` es `log`, el JSON tiene esta forma:

```json theme={null}
{
  "acme_courier": {
    "enabled": true,
    "driver": "log"
  }
}
```

En la CLI, `Enabled` se muestra como `ENABLED`. `AboutCommand::format()` es un helper que permite indicar `console` para la CLI y `json` para JSON. El ejemplo anterior solo indica `console`, por lo que JSON devuelve el valor booleano original. No es necesario reutilizar en JSON la cadena que se muestra en la CLI.

| Elemento | Conversión y procesamiento en la implementación |
| - | - |
| Valores de `--only` y nombres de sección | Se comparan tras pasarlos a minúsculas y convertirlos a snake case |
| Claves de sección en JSON | El nombre de la sección se convierte a snake case |
| Claves de elemento en JSON | El nombre del elemento se pasa a minúsculas y luego se convierte a snake case |
| Valores de `format()` | En la CLI se usa `console` y en JSON se usa `json`. Si no se indican, se usa el valor original |

Usar nombres formados por palabras corrientes en inglés separadas por espacios, como en el ejemplo, facilita el manejo de los filtros y de las claves JSON. Las claves que consultan los procesos automatizados pueden cambiar al modificar el nombre mostrado, así que comprueba la compatibilidad en cada versión.

## Usar un nombre de sección propio del paquete

`add()` añade elementos a la misma sección. Indicar una sección con el mismo nombre no sustituye todo el contenido registrado anteriormente.

Elige un nombre como `Acme Courier` que se distinga de otros paquetes, y limita las adiciones a las secciones estándar de Laravel `Environment`, `Cache`, `Drivers` y `Storage` a los casos en que sea necesario.

Si registras varias veces un elemento con el mismo nombre en la misma sección, en la CLI pueden quedar varias líneas, pero en JSON se agrupan en la misma clave y se conserva el último valor. Evita también nombres que, aunque se escriban de forma distinta, den lugar a la misma clave tras la conversión a snake case. Concentra el registro en un único lugar y diseña los elementos para que sean únicos tanto en la CLI como en JSON.

## Gestionar el estado estático del registro en las pruebas

Al iniciar la ejecución de `about` se reinicia `$data`, que contiene los datos que se muestran, pero se conserva `$customDataResolvers`, la lista de registros de información adicional. Esto permite volver a recopilar la información a partir de los mismos registros en cada ejecución, pero si el `boot()` de un provider se ejecuta repetidamente en el mismo proceso PHP, los registros pueden acumularse.

`AboutCommand::flushState()` es un método que elimina **los registros de todos los paquetes** y los datos que se muestran. No lo llames en un provider de producción para evitar duplicar tu propia sección. Se perdería también la información de diagnóstico de otros paquetes.

Si reconstruyes la aplicación con tu propia infraestructura de pruebas, decide quién es responsable de reiniciar el estado entre pruebas. Si lo reinicias, hazlo antes de arrancar los providers afectados y realiza después todos los registros necesarios. Comprueba también si tu infraestructura de pruebas existente ya reinicia el estado.

### Puntos de verificación antes de publicar

Comprueba las siguientes combinaciones con [Probar paquetes Laravel con Orchestra Testbench](/es/advanced/package-testing) y en una aplicación real que use tu paquete.

| Operación que se comprueba | Resultado esperado |
| - | - |
| `about --only=acme_courier` | Solo se muestra la sección del paquete, sin elementos duplicados |
| `about --only=acme_courier --json` | `enabled` se obtiene como booleano y `driver` como string |
| `about --only=environment` | La recopilación de información del paquete no implica comunicación externa ni efectos secundarios, y el comando finaliza correctamente |
| Cambiar la activación o el driver | Los valores mostrados y los de JSON corresponden a la configuración en el momento de ejecutar el comando |
| Ejecutar dos veces en la misma aplicación | Los elementos no se acumulan y la información se vuelve a recopilar en cada ejecución |
| Reconstruir la aplicación en el mismo proceso PHP | El estado del registro no se filtra entre pruebas y no se pierde la información de otros paquetes |
| Con la caché de configuración presente | Se muestran los valores de configuración que usa realmente la aplicación, no el contenido del archivo de configuración publicado |

## Páginas relacionadas

<Columns cols={2}>
  <Card title="Desarrollo de paquetes para Laravel" icon="box" href="/es/advanced/package-development">
    Repasa los fundamentos de los providers y del registro de recursos.
  </Card>

  <Card title="Fusión y caché de la configuración de paquetes" icon="sliders" href="/es/advanced/package-config-merging">
    Repasa la relación entre los valores por defecto, las sobrescrituras del usuario y la caché de configuración.
  </Card>
</Columns>

## Fuentes primarias consultadas

* [Documentación oficial de Laravel: añadir información de paquetes a about](https://github.com/laravel/docs/blob/13.x/packages.md#about-artisan-command)
* [Documentación oficial de Laravel: about y --only](https://github.com/laravel/docs/blob/13.x/configuration.md#the-about-command)
* [Laravel Framework v13.35.0: AboutCommand](https://github.com/laravel/framework/blob/v13.35.0/src/Illuminate/Foundation/Console/AboutCommand.php): registro, orden de evaluación, conversión de claves, `format()` y `flushState()`.
* [Laravel Framework v13.35.0: pruebas de format](https://github.com/laravel/framework/blob/v13.35.0/tests/Foundation/Console/AboutCommandTest.php)
* [Laravel Framework v13.35.0: pruebas de integración de la salida JSON](https://github.com/laravel/framework/blob/v13.35.0/tests/Integration/Foundation/Console/AboutCommandTest.php)


## Related topics

- [Desarrollo de paquetes para Laravel](/es/advanced/package-development.md)
- [Laravel Doctor — herramienta de diagnóstico de la aplicación](/es/blog/laravel-doctor-introduction.md)
- [Análisis estático de paquetes (PHPStan / Larastan)](/es/advanced/package-static-analysis.md)
- [Paquete core y drivers personalizados - Feedable](/es/packages/feedable/core.md)
- [Canal de notificaciones - LINE SDK for Laravel](/es/packages/laravel-line-sdk/notification.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.