Illuminate\Support\Manager ist eine abstrakte Klasse, die es seit Laravel 4.0 gibt. Sie stellt die Grundlage bereit, um Systeme zu bauen, in denen sich verschiedene „Treiber” für Cache, Session, Mail usw. einfach austauschen lassen.Ein „Treiber” ist ein Backend mit gleicher Schnittstelle, aber unterschiedlicher interner Implementierung. Bei Sessions z. B. gibt es die Treiber file, cookie, database, redis — umgeschaltet wird über den driver-Key in der Konfigurationsdatei.
Nicht jede Klasse mit dem Namen Manager erbt tatsächlich von Illuminate\Support\Manager.
Klasse
Erbt von Manager?
Illuminate\Session\SessionManager
✅ Ja
Illuminate\Cache\CacheManager
❌ Nein (Eigenimplementierung)
Illuminate\Queue\QueueManager
❌ Nein (Eigenimplementierung)
Laravel\Socialite\SocialiteManager
✅ Ja
Auch die nicht erbenden Klassen folgen demselben Grundprinzip der Erweiterung über extend(). Wer das Manager-Muster versteht, versteht daher auch weite Teile des Frameworks.
Der Aufruf von driver() löst den Treiber in folgender Reihenfolge auf.Im tatsächlichen Quellcode wird der Methodenname aus dem Treibernamen per Str::studly() zusammengesetzt.
// Aus Illuminate\Support\Manager::createDriver()protected function createDriver($driver){ if (isset($this->customCreators[$driver])) { return $this->callCustomCreator($driver); } $method = 'create'.Str::studly($driver).'Driver'; if (method_exists($this, $method)) { return $this->$method(); } throw new InvalidArgumentException("Driver [$driver] not supported.");}
Der file-Treiber ruft also createFileDriver(), der Treiber my-custom ruft createMyCustomDriver().
Übergeben Sie an extend() den Treibernamen und eine Closure, um einen eigenen Treiber zu registrieren. Als Argument erhält die Closure die Container-Instanz.
use Illuminate\Support\Facades\Session;Session::extend('redis-cluster', function ($app) { return new RedisClusterSessionHandler( $app->make('redis'), $app['config']['session'], );});
extend() bindet die Closure an $this, sodass Sie in ihr auf Properties und Methoden des Managers zugreifen können.
Als Beispiel bauen wir einen Benachrichtigungsdienst als von Manager abgeleitete Klasse.
1
Von Manager ableitende Klasse erstellen
namespace App\Notifications;use Illuminate\Support\Manager;class NotificationManager extends Manager{ public function getDefaultDriver(): string { return $this->config->get('notifications.driver', 'slack'); } protected function createSlackDriver(): SlackNotifier { return new SlackNotifier( $this->config->get('notifications.slack'), ); } protected function createEmailDriver(): EmailNotifier { return new EmailNotifier( $this->config->get('notifications.email'), ); } protected function createLogDriver(): LogNotifier { return new LogNotifier( $this->container->make('log'), ); }}
2
Im Service Provider registrieren
namespace App\Providers;use App\Notifications\NotificationManager;use Illuminate\Support\ServiceProvider;class NotificationServiceProvider extends ServiceProvider{ public function register(): void { $this->app->singleton(NotificationManager::class, function ($app) { return new NotificationManager($app); }); }}
3
Einen eigenen Treiber ergänzen
// z. B. in AppServiceProvider::boot()$manager = app(NotificationManager::class);$manager->extend('teams', function ($app) { return new TeamsNotifier( $app['config']['notifications.teams'], );});
4
Nutzung
$manager = app(NotificationManager::class);// Default-Treiber verwenden$manager->send('Nachricht');// Einen bestimmten Treiber wählen$manager->driver('email')->send('Nachricht');// Einmal aufgelöste Treiber werden gecacht$manager->driver('slack'); // Gibt dieselbe Instanz zurück
Illuminate\Support\MultipleInstanceManager wurde in Laravel 10 hinzugefügt. Während Manager die „Art” eines Treibers verwaltet, kann MultipleInstanceManager mehrere benannte „Instanzen” verwalten.
Wer von MultipleInstanceManager ableitet, muss drei Methoden implementieren.
// Aus dem Quellcodeabstract public function getDefaultInstance();abstract public function setDefaultInstance($name);abstract public function getInstanceConfig($name);
getInstanceConfig() gibt das Konfigurationsarray zu einem Namen zurück. Die Konfiguration muss zwingend den Schlüssel driver (bzw. den mit $driverKey gesetzten Namen) enthalten.
Die Nutzung erfolgt über instance() mit einem Namen.
$sms = app(SmsManager::class);// Default-Instanz nutzen (primary = twilio)$sms->send('+491701234567', 'Bestätigungscode: 123456');// Instanz nach Name auswählen$sms->instance('backup')->send('+491701234567', 'Bestätigungscode: 123456');// Marketing-Instanz nutzen$sms->instance('marketing')->send('+491701234567', 'Kampagnen-Info');
Wie Manager kann auch MultipleInstanceManager über extend() um eigene Treiber erweitert werden. Es implementiert ebenfalls __call, sodass unbekannte Methoden an die Default-Instanz delegiert werden.
// Eine bestimmte Instanz löschen$manager->forgetInstance('backup');// Default-Instanz löschen$manager->forgetInstance();// Mehrere Instanzen auf einmal löschen$manager->forgetInstance(['primary', 'backup']);// Instanz löschen und Cache leeren$manager->purge('backup');