# Service Providers * Introduction * Writing Service Providers * The Register Method * The Boot Method * Registering Providers * Deferred Providers ## Introduction Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services, are bootstrapped via service providers. But, what do we mean by "bootstrapped"? In general, we mean **registering** things, including registering service container bindings, event listeners, middleware, and even routes. Service providers are the central place to configure your application. Laravel uses dozens of service providers internally to bootstrap its core services, such as the mailer, queue, cache, and others. Many of these providers are "deferred" providers, meaning they will not be loaded on every request, but only when the services they provide are actually needed. All user-defined service providers are registered in the `bootstrap/providers.php` file. In the following documentation, you will learn how to write your own service providers and register them with your Laravel application. If you would like to learn more about how Laravel handles requests and works internally, check out our documentation on the Laravel [request lifecycle](/docs/12.x/lifecycle). ## Writing Service Providers All service providers extend the `Illuminate\Support\ServiceProvider` class. Most service providers contain a `register` and a `boot` method. Within the `register` method, you should **only bind things into the[service container](/docs/12.x/container)**. You should never attempt to register any event listeners, routes, or any other piece of functionality within the `register` method. The Artisan CLI can generate a new provider via the `make:provider` command. Laravel will automatically register your new provider in your application's `bootstrap/providers.php` file: 1php artisan make:provider RiakServiceProvider php artisan make:provider RiakServiceProvider ### The Register Method As mentioned previously, within the `register` method, you should only bind things into the [service container](/docs/12.x/container). You should never attempt to register any event listeners, routes, or any other piece of functionality within the `register` method. Otherwise, you may accidentally use a service that is provided by a service provider which has not loaded yet. Let's take a look at a basic service provider. Within any of your service provider methods, you always have access to the `$app` property which provides access to the service container: 1app->singleton(Connection::class, function (Application $app) { 17 return new Connection(config('riak')); 18 }); 19 } 20} app->singleton(Connection::class, function (Application $app) { return new Connection(config('riak')); }); } } This service provider only defines a `register` method, and uses that method to define an implementation of `App\Services\Riak\Connection` in the service container. If you're not yet familiar with Laravel's service container, check out [its documentation](/docs/12.x/container). #### The `bindings` and `singletons` Properties If your service provider registers many simple bindings, you may wish to use the `bindings` and `singletons` properties instead of manually registering each container binding. When the service provider is loaded by the framework, it will automatically check for these properties and register their bindings: 1 DigitalOceanServerProvider::class, 21 ]; 22  23 /** 24 * All of the container singletons that should be registered. 25 * 26 * @var array 27 */ 28 public $singletons = [ 29 DowntimeNotifier::class => PingdomDowntimeNotifier::class, 30 ServerProvider::class => ServerToolsProvider::class, 31 ]; 32} DigitalOceanServerProvider::class, ]; /** * All of the container singletons that should be registered. * * @var array */ public $singletons = [ DowntimeNotifier::class => PingdomDowntimeNotifier::class, ServerProvider::class => ServerToolsProvider::class, ]; } ### The Boot Method So, what if we need to register a [view composer](/docs/12.x/views#view- composers) within our service provider? This should be done within the `boot` method. **This method is called after all other service providers have been registered** , meaning you have access to all other services that have been registered by the framework: 1macro('serialized', function (mixed $value) { 9 // ... 10 }); 11} use Illuminate\Contracts\Routing\ResponseFactory; /** * Bootstrap any application services. */ public function boot(ResponseFactory $response): void { $response->macro('serialized', function (mixed $value) { // ... }); } ## Registering Providers All service providers are registered in the `bootstrap/providers.php` configuration file. This file returns an array that contains the class names of your application's service providers: 1app->singleton(Connection::class, function (Application $app) { 18 return new Connection($app['config']['riak']); 19 }); 20 } 21  22 /** 23 * Get the services provided by the provider. 24 * 25 * @return array 26 */ 27 public function provides(): array 28 { 29 return [Connection::class]; 30 } 31} app->singleton(Connection::class, function (Application $app) { return new Connection($app['config']['riak']); }); } /** * Get the services provided by the provider. * * @return array */ public function provides(): array { return [Connection::class]; } }