diff --git a/inc/Config/ArraySerializable.php b/inc/Config/ArraySerializable.php index 94f39dd4..ef45ab21 100644 --- a/inc/Config/ArraySerializable.php +++ b/inc/Config/ArraySerializable.php @@ -34,6 +34,11 @@ final public static function from_array( array $config, ?ValidatorInterface $val return $subclass::from_array( $config, $validator ); } + $config = static::migrate_config( $config ); + if ( is_wp_error( $config ) ) { + return $config; + } + $config = static::preprocess_config( $config ); if ( is_wp_error( $config ) ) { return $config; @@ -91,4 +96,15 @@ protected static function get_implementor( array $config ): ?string { * @inheritDoc */ abstract public static function get_config_schema(): array; + + /** + * Migrates the config to the current schema version. + * Can be overridden by child classes to perform custom migrations. + * + * @param array $config The config to migrate. + * @return array The migrated config. + */ + public static function migrate_config( array $config ): array|WP_Error { + return $config; + } } diff --git a/inc/Config/ArraySerializableInterface.php b/inc/Config/ArraySerializableInterface.php index 92f3243c..2cee6b9a 100644 --- a/inc/Config/ArraySerializableInterface.php +++ b/inc/Config/ArraySerializableInterface.php @@ -39,6 +39,14 @@ public static function preprocess_config( array $config ): array|WP_Error; */ public static function get_config_schema(): array; + /** + * Migrates the config to the current schema version. + * + * @param array $config The config to migrate. + * @return array The migrated config. + */ + public static function migrate_config( array $config ): array|WP_Error; + /** * Converts the current object to an array representation. * diff --git a/inc/Config/DataSource/HttpDataSource.php b/inc/Config/DataSource/HttpDataSource.php index d1ef6d54..1be71bde 100644 --- a/inc/Config/DataSource/HttpDataSource.php +++ b/inc/Config/DataSource/HttpDataSource.php @@ -105,4 +105,11 @@ protected static function map_service_config( array $service_config ): array { 'request_headers' => $service_config['request_headers'] ?? [], ]; } + + /** + * @inheritDoc + */ + public static function migrate_config( array $config ): array|WP_Error { + return $config; + } }