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);
}
}