> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Paketkonfiguration zusammenführen und cachen

> Anhand der ServiceProvider-Implementierung von Laravel 13 erfahren Sie den Unterschied zwischen flachem Zusammenführen und rekursivem Ersetzen, die Fallstricke bei Arrays mit numerischen Schlüsseln und wie Sie Pakete unter Berücksichtigung des Konfigurations-Caches pflegen.

Wenn Sie Ihrem Paket neue Konfigurationsoptionen hinzufügen, werden diese nicht automatisch in Konfigurationsdateien geschrieben, die Nutzer bereits früher veröffentlicht haben. Um Standardwerte zu ergänzen, ohne veröffentlichte Konfigurationen zu beschädigen, müssen Sie sowohl die Strategie zum Zusammenführen der Arrays als auch den Konfigurations-Cache bewusst gestalten.

Auf dieser Seite lesen Sie den `ServiceProvider` von Laravel 13 und erfahren, wie Sie die Konfiguration als öffentliche API Ihres Pakets pflegen. Die Seite setzt die [Grundlagen der Paketentwicklung](/de/advanced/package-development) voraus. Zur Überprüfung der Implementierung wird `laravel/framework` in Version `v13.34.0` verwendet.

## Veröffentlichen und Zusammenführen sind getrennte Vorgänge

`publishes()` registriert eine Quelle und ein Ziel für das Kopieren. Bis `vendor:publish` die Datei kopiert, bleibt das `config`-Verzeichnis der Nutzer unverändert. `mergeConfigFrom()` hingegen aktualisiert das Konfigurations-Repository beim Start der Anwendung und verändert die Datei selbst nicht.

```php theme={null}
<?php

namespace Acme\Courier;

use Illuminate\Support\ServiceProvider;

class CourierServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->mergeConfigFrom(
            __DIR__.'/../config/courier.php', 'courier'
        );
    }

    public function boot(): void
    {
        $this->publishes([
            __DIR__.'/../config/courier.php' => config_path('courier.php'),
        ], 'courier-config');
    }
}
```

Nutzer veröffentlichen die Konfigurationsdatei nur bei Bedarf. Auch ohne Veröffentlichung werden bei einem normalen Start ohne Cache die Standardwerte über das Zusammenführen in `register()` verwendet.

```bash theme={null}
php artisan vendor:publish --tag=courier-config
```

<Warning>
  Wenn Sie als Update-Schritt die Konfigurationsdatei mit `--force` erneut veröffentlichen, werden die Änderungen der Nutzer überschrieben. Wenn Sie nur neue Konfigurationsoptionen hinzufügen, sollten Sie stattdessen Standardwerte ergänzen und auf die Änderungen hinweisen.
</Warning>

## mergeConfigFrom() führt nur die oberste Ebene zusammen

`ServiceProvider::mergeConfigFrom()` übergibt zuerst die Paketkonfiguration und danach die bestehende Konfiguration der Anwendung an `array_merge()`. Bei gleichen String-Schlüsseln hat der Wert der Anwendung Vorrang.

Das folgende Beispiel bildet den Zusammenführungsvorgang des Frameworks nur mit Arrays nach.

```php theme={null}
<?php

$defaults = [
    'enabled' => true,
    'transport' => [
        'timeout' => 10,
        'retries' => 3,
    ],
];

$overrides = [
    'transport' => [
        'timeout' => 30,
    ],
];

$config = array_merge($defaults, $overrides);

var_export($config);
```

```text theme={null}
array (
  'enabled' => true,
  'transport' =>
  array (
    'timeout' => 30,
  ),
)
```

Das oberste `enabled` wird ergänzt, `transport` wird jedoch als gesamtes Array ersetzt. `transport.retries` bleibt nicht erhalten. Wichtig ist: Wenn Nutzer bereits ein altes `transport`-Array veröffentlicht haben, werden neue Schlüssel, die Sie demselben Array hinzufügen, nicht ergänzt.

## Verschachtelte Konfiguration mit replaceConfigRecursivelyFrom() ergänzen

Der `ServiceProvider` von Laravel 13 enthält außerdem die protected-Methode `replaceConfigRecursivelyFrom()`. Sie führt in derselben Reihenfolge `array_replace_recursive()` aus.

Wenn Ihre Konfigurations-API das einzelne Überschreiben verschachtelter String-Schlüssel erlauben soll, ändern Sie `register()` im Provider wie folgt. Für denselben Konfigurationsschlüssel müssen Sie sie nicht zusätzlich zu `mergeConfigFrom()` von oben verwenden.

```php theme={null}
public function register(): void
{
    $this->replaceConfigRecursivelyFrom(
        __DIR__.'/../config/courier.php', 'courier'
    );
}
```

Mit den obigen `$defaults` und `$overrides` ergibt sich folgendes Ergebnis.

```php theme={null}
$config = array_replace_recursive($defaults, $overrides);

var_export($config);
```

```text theme={null}
array (
  'enabled' => true,
  'transport' =>
  array (
    'timeout' => 30,
    'retries' => 3,
  ),
)
```

| Konfigurationsvertrag | Gewählter Vorgang | Hinweis |
| - | - | - |
| Nutzer geben verschachtelte Arrays vollständig an | `mergeConfigFrom()` | Nicht angegebene Schlüssel innerhalb des Arrays werden nicht ergänzt |
| Nutzer geben verschachtelte Einträge nur teilweise an | `replaceConfigRecursivelyFrom()` | Auch Listen mit numerischen Schlüsseln werden rekursiv ersetzt |

<Info>
  `replaceConfigRecursivelyFrom()` ist eine Methode, die im auf dieser Seite geprüften Quellcode von Laravel 13 existiert. Unterscheiden Sie sie von `mergeConfigFrom()`, das in der offiziellen Dokumentation zur Paketentwicklung vorgestellt wird, und prüfen Sie vor der Verwendung die Implementierung der jeweiligen Framework-Version.
</Info>

### Listen mit numerischen Schlüsseln werden nicht vollständig ersetzt

Rekursives Ersetzen bedeutet nicht, dass das Array vollständig durch die Werte der Nutzer ausgetauscht wird. Auch bei numerischen Schlüsseln wird nur der Wert mit demselben Schlüssel ersetzt, und Schlüssel, die Nutzer nicht angegeben haben, bleiben erhalten.

```php theme={null}
<?php

$defaults = ['channels' => ['mail', 'database']];
$overrides = ['channels' => ['slack']];

$config = array_replace_recursive($defaults, $overrides);

var_export($config['channels']);
```

```text theme={null}
array (
  0 => 'slack',
  1 => 'database',
)
```

Auch wenn Nutzer nur `['slack']` angeben, bleibt `database` erhalten. Außerdem wird die Standardliste nicht geleert, wenn Sie `['channels' => []]` übergeben. Achten Sie besonders bei Konfigurationen darauf, bei denen die Angabe der gesamten Liste eine Bedeutung hat, etwa bei Benachrichtigungszielen oder Middleware.

Wenn Ihr Paket solche Konfigurationen enthält, überdenken Sie die Struktur der Konfiguration. Sie können zum Beispiel Listen und teilweise überschreibbare assoziative Arrays auf getrennte Schlüssel der obersten Ebene verteilen und flaches Zusammenführen verwenden. Wenn Sie die Zusammenführungsstrategie eines bereits veröffentlichten Pakets ändern, verhält sich dieselbe Konfigurationsdatei anders. Behandeln Sie dies daher nicht als bloßen Austausch der Implementierung.

## Der Konfigurations-Cache speichert die zusammengeführten Werte

Beide Methoden überspringen das Zusammenführen, wenn die Anwendung `CachesConfiguration` implementiert und `configurationIsCached()` `true` zurückgibt. In einer gewöhnlichen Laravel-Anwendung trifft dies auf Starts zu, bei denen ein Konfigurations-Cache vorhanden ist.

`ConfigCacheCommand` löscht den alten Konfigurations-Cache, startet eine neue Anwendung und ruft das gesamte Konfigurations-Repository ab. Bei diesem Start wird die Konfiguration der Provider zusammengeführt und das Ergebnis in der Cache-Datei gespeichert. Bei nachfolgenden Starts lädt `LoadConfiguration` diese Werte.

```mermaid theme={null}
flowchart TD
    A["php artisan config:cache"] --> B["Alten Konfigurations-Cache löschen"]
    B --> C["Neue Anwendung starten"]
    C --> D["Konfigurationsdateien laden<br>In Providern zusammenführen"]
    D --> E["Gesamtes Konfigurations-Repository speichern"]
    E --> F["Spätere Starts nutzen gespeicherte Konfiguration<br>Beide Merge-Methoden werden übersprungen"]
```

Wenn sich also durch ein Paket-Update Standardwerte oder die Zusammenführungsstrategie ändern, wirkt sich das nicht auf Anwendungen aus, die weiterhin einen alten Cache verwenden. Bei Deployments mit Konfigurations-Cache bauen Sie den Cache mit dem aktualisierten Code neu auf.

```bash theme={null}
php artisan config:cache
```

Wenn Sie während der Entwicklung wieder zum Laden aus den Dateien zurückkehren möchten, verwenden Sie `php artisan config:clear`. Legen Sie den Speicherort des Caches nicht selbst fest, sondern überlassen Sie die Verwaltung den Laravel-Befehlen.

<Warning>
  Definieren Sie keine Closures in Konfigurationsdateien. Sie lassen sich mit `config:cache` nicht korrekt serialisieren. Wenn Sie einen Callback übergeben möchten, legen Sie in der Konfiguration zum Beispiel einen Klassennamen ab und registrieren den eigentlichen Service im Provider.
</Warning>

## Prüfungen vor der Veröffentlichung von Konfigurationsänderungen

Behandeln Sie in den Tests Ihres Pakets nicht nur unveröffentlichte Konfigurationen, sondern auch Konfigurationen, die aus älteren Versionen übrig geblieben sind, als Eingabe.

* Auch ohne veröffentlichte Konfiguration lassen sich die erforderlichen Standardwerte abrufen.
* Bei einer alten veröffentlichten Konfiguration haben die Werte der Nutzer Vorrang, und neue Einträge werden wie vorgesehen ergänzt.
* Der Überschreibungsvertrag für verschachtelte Arrays, Listen mit numerischen Schlüsseln und leere Arrays bleibt unverändert.
* `config:cache` läuft in der nutzenden Anwendung erfolgreich, und ein separater Start mit Cache liefert dieselbe Konfiguration.

Nennen Sie in den Release Notes die Standardwerte neuer Schlüssel und einen gegebenenfalls nötigen Neuaufbau des Caches. Beim Entfernen oder Umbenennen von Schlüsseln und beim Ändern der Zusammenführungsstrategie berücksichtigen Sie auch die Kompatibilität mit den veröffentlichten Konfigurationen der Nutzer.

## Verwandte Seiten

<Columns cols={2}>
  <Card title="Pakete testen" icon="flask" href="/de/advanced/package-testing">
    Registrieren Sie Service Provider und überprüfen Sie das Verhalten von Konfiguration und Services.
  </Card>

  <Card title="Versionskompatibilität verwalten" icon="code-branch" href="/de/advanced/package-versioning">
    Verknüpfen Sie Änderungen an der öffentlichen API mit Ihrer Release-Strategie und der laufenden Wartung.
  </Card>
</Columns>

## Verwendete Primärquellen

* [Offizielle Laravel-Dokumentation: Paketkonfiguration](https://github.com/laravel/docs/blob/13.x/packages.md#configuration)
* [ServiceProvider: Implementierung von Zusammenführen und Veröffentlichen](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Support/ServiceProvider.php)
* [ConfigCacheCommand: Erzeugen des Konfigurations-Caches](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Foundation/Console/ConfigCacheCommand.php)
* [LoadConfiguration: Laden der Konfiguration](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php)
* [ConfigClearCommand: Löschen des Konfigurations-Caches](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Foundation/Console/ConfigClearCommand.php)


## Related topics

- [Laravel-Paketentwicklung](/de/advanced/package-development.md)
- [Weiterführende Themen](/de/advanced/index.md)
- [Deployment](/de/deployment.md)
- [Cache](/de/cache.md)
- [Laravel AI SDK](/de/ai-sdk.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.