Skip to main content

Qué es un paquete

En Laravel, un paquete es un paquete de Composer que añade funcionalidad a la aplicación. Hay dos tipos principales.
  • Paquete independiente — biblioteca PHP de propósito general que no depende de Laravel (por ejemplo: Carbon, Pest).
  • Paquete de Laravel — paquete que ofrece funciones integradas con Laravel, como rutas, controladores, vistas o configuración.
Esta guía trata el segundo caso, el desarrollo de paquetes específicos para Laravel. El desarrollo de paquetes requiere un conocimiento profundo de la estructura interna de Laravel, incluidos los service providers, las fachadas y la publicación de archivos de configuración.
Si vas a escribir pruebas para el paquete, utiliza Orchestra Testbench. Podrás escribir las pruebas del paquete igual que en una aplicación Laravel normal.

Detección automática de paquetes

Cuando instalas un paquete, Laravel lee la sección extra.laravel de composer.json y registra automáticamente los service providers y las fachadas.
Con esta configuración, el paquete se carga automáticamente sin que el usuario tenga que editar bootstrap/providers.php a mano.
En Estructura interna de la detección automática de paquetes se explica cómo se implementa esta detección automática y cuándo se reconstruye la caché.

Desactivar la detección automática

Si el usuario quiere desactivar la detección automática de un paquete concreto, puede configurarlo en el composer.json de la aplicación.

El papel del service provider

El service provider es el punto de entrada del paquete. Aquí es donde concentras el registro de recursos como vistas, configuración, migraciones o rutas en Laravel. Un service provider extiende Illuminate\Support\ServiceProvider y dispone de dos métodos: register y boot.
No registres listeners de eventos, rutas o vistas dentro del método register. Podrías utilizar por error servicios de otro service provider que aún no se ha cargado. Todo lo que no sean bindings debe hacerse en el método boot.

Publicación de archivos de configuración

publishes() — publicar archivos

Si llamas a publishes() dentro del método boot, el usuario podrá copiar el archivo de configuración a su aplicación mediante el comando vendor:publish.
Una vez publicado, puedes acceder a los valores de configuración con el mecanismo habitual de config.

mergeConfigFrom() — fusionar con los valores por defecto

Si utilizas mergeConfigFrom() en el método register, los valores por defecto del paquete se aplicarán aunque el usuario no haya publicado el archivo de configuración.
mergeConfigFrom() no fusiona los niveles más profundos de los arrays anidados. En configuraciones con arrays multidimensionales, es posible que si el usuario define solo una parte, el resto de las opciones no se fusionen.

Separar grupos de publicación mediante etiquetas

Si pasas una etiqueta como segundo argumento a publishes(), el usuario podrá publicar solo los recursos que necesite.

Registro de rutas

Utiliza loadRoutesFrom() para cargar el archivo de rutas. Si la caché de rutas de la aplicación está activa, se omite automáticamente.
Dentro del archivo de rutas apuntas a los controladores del paquete.

Publicación de migraciones

Con publishesMigrations() puedes publicar los archivos de migración. Al publicar, Laravel actualiza automáticamente las marcas de tiempo.

Publicación de vistas

loadViewsFrom() — registrar vistas

Registra el directorio de vistas con loadViewsFrom(). El segundo argumento es el espacio de nombres, que se utiliza para referenciar las vistas con el formato paquete::vista.
Una vez registradas, las vistas se referencian con el espacio de nombres del paquete.
Laravel busca las vistas en dos ubicaciones. Primero comprueba el directorio resources/views/vendor/courier de la aplicación y, si no existe, utiliza el directorio de vistas del paquete. Esto permite al usuario personalizar las vistas.

Publicar las vistas

Registrar componentes Blade

Si el paquete incluye componentes, regístralos en el método boot.
También puedes registrarlos por lotes usando un espacio de nombres de componentes.

Publicación de archivos de traducción

Registra los archivos de traducción con loadTranslationsFrom(). Las traducciones se referencian con el formato paquete::archivo.clave.
Si utilizas archivos de traducción en JSON, usa loadJsonTranslationsFrom().

Registro de comandos

Los comandos Artisan del paquete se registran con el método commands(). Lo habitual es registrarlos solo en el entorno de consola.

Integración con el comando optimize

Si el paquete tiene su propia caché, puedes integrarlo con php artisan optimize y php artisan optimize:clear mediante el método optimizes().

Añadir información al comando about

Para añadir información del paquete a la salida de php artisan about, utiliza AboutCommand::add().

Creación de fachadas

Las fachadas permiten invocar los bindings del service container como si fueran métodos estáticos.
1

Crea la clase de servicio

2

Crea la clase de fachada

Extiende Illuminate\Support\Facades\Facade y devuelve la clave del binding del service container en getFacadeAccessor().
3

Vincúlala en el service provider

4

Regístrala en composer.json

Al añadir anotaciones PHPDoc @method a los métodos de la fachada, se habilita el autocompletado del IDE.

DeferrableProvider — implementar la carga diferida

Los providers que solo realizan bindings al service container pueden implementar la interfaz DeferrableProvider para lograr una carga diferida. Como el provider no se carga hasta que un servicio se necesita realmente, mejora el rendimiento de la aplicación.
Laravel compila y almacena la lista de servicios que ofrecen los providers diferidos. El provider solo se carga cuando se resuelve alguno de los servicios enumerados en provides().
No utilices DeferrableProvider en providers que necesiten registrar recursos (vistas, rutas, listeners de eventos, etc.). Si se cargan de forma diferida, esos recursos podrían no quedar registrados.

Pruebas del paquete

Para probar el paquete por separado, utiliza Orchestra Testbench. Podrás escribir las pruebas del paquete como si estuvieras dentro de una aplicación Laravel normal.
En el caso de prueba, sobreescribe getPackageProviders() para registrar el service provider del paquete.

Publicación en Composer

Buenas prácticas para publicar el paquete en Packagist. Configuración básica de composer.json
Al depender de illuminate/support puedes incluir como dependencia únicamente los componentes de Laravel que necesites, en lugar de todo illuminate/framework. Mantén reducido el árbol de dependencias del paquete.
Ejemplo de estructura de directorios

Páginas relacionadas

Service providers

Revisa los métodos register y boot de los service providers y los detalles de los providers diferidos.

Gestión de compatibilidad de versiones

Explica la estrategia para adaptarse a los cambios de versión mayor de Laravel y PHP y la configuración de la matriz de pruebas en GitHub Actions.
Última modificación el 2 de agosto de 2026