GitHub

Service Providers

Service providers are the central place of application bootstrapping. They allow you to register bindings, event listeners, middleware, and more in a structured way.

Creating Providers

Generate a new provider using the Spark CLI:

php spark make:provider AuthServiceProvider

This creates a new provider in app/Providers/AuthServiceProvider.php:

<?php
        
namespace App\Providers;

use Spark\Container;

class AuthServiceProvider
{
    public function register(Container $container)
    {
        // Register bindings here
    }

    public function boot(Container $container)
    {
        // Perform bootstrapping here
    }
}

Registering Providers

Add providers to bootstrap/providers.php:

return [
    \App\Providers\AppServiceProvider::class,
    \App\Providers\AuthServiceProvider::class,
    \App\Providers\EventServiceProvider::class,
];

Provider Methods

register()

Used to bind services into the container:

public function register(Container $container)
{
    $container->singleton(Auth::class, function(Container $container) {
        return new Auth(
            $container->get(Session::class),
            User::class,
            [
                'cache_enabled' => false,
                'guest_route' => 'admin.auth.login',
                'logged_in_route' => 'admin.dashboard',
            ]
        );
    });
}

boot()

Called after all providers are registered:

public function boot(Container $container)
{
    // Register event listeners
    event([
        'user.created' => [SendWelcomeEmail::class],
    ]);
    
    // Define authorization abilities
    gate([
        'edit.profile' => function(User $user) {
            return $user->isAdmin() || $user->isOwner();
        }
    ]);
}

Common Use Cases

Database Bindings

public function register(Container $container)
{
    $container->singleton(Connection::class, function() {
        return new DatabaseConnection(config('database'));
    });
}

Third-Party Integrations

public function register(Container $container)
{
    $container->singleton(Mailer::class, function() {
        return new SMTPMailer(config('mail'));
    });
}

Custom Services

public function register(Container $container)
{
    $container->singleton('geoip', function() {
        return new GeoIPService(config('geoip'));
    });
}

Best Practices

  • Keep providers focused on a specific domain
  • Use register() only for bindings
  • Perform initialization in boot()
  • Group related bindings in dedicated providers
  • Load providers in order of dependency

Full Example

<?php

namespace App\Providers;

use Spark\Container;
use App\Services\Analytics;
use App\Listeners\TrackUserLogin;

class AnalyticsServiceProvider
{
    public function register(Container $container)
    {
        $container->singleton(Analytics::class, function() {
            return new Analytics(config('analytics.key'));
        });
    }

    public function boot(Container $container)
    {
        event()->addListener('user.login', function($user) use ($container) {
            $container->get(Analytics::class)->track('login', $user->id);
        });
        
        // Or using listener class
        event()->addListener('user.login', TrackUserLogin::class);
    }
}