Lexicon

Added in version 32.

Since v32, Nextcloud provides a way to centralize the definition of your app’s configuration keys and values in a single place.

Concept overview

Nextcloud includes the ILexicon API to create a Lexicon of your config keys. This lexicon allow developers to define the config keys of their apps, their value type and additional details.

Enforcing a unique configuration for each of your config keys in a single location help avoid their misuse.

Details about each config key are:
  • config value expected type,

  • a default value,

  • a description of its use,

  • lazy loading setting,

  • flags the config key as sensitive or indexable

Registering your Lexicon

The Lexicon is set in a local class that implements OCPConfigLexiconILexicon and registered from your Application.php:

public function register(IRegistrationContext $context): void {
    $context->registerConfigLexicon(\OCA\MyApp\ConfigLexicon::class);
}

Example of the registered ConfigLexicon.php:

use OCP\Config\Lexicon\Entry;
use OCP\Config\Lexicon\ILexicon;
use OCP\Config\Lexicon\Strictness;
use OCP\Config\ValueType;

class Lexicon implements ILexicon {
    public function getStrictness(): Strictness {
        return Strictness::WARNING;
    }

    public function getAppConfigs(): array {
        return [
            new Entry('key1', ValueType::STRING, 'abcde', 'test key', true, IAppConfig::FLAG_SENSITIVE),
            new Entry('key2', ValueType::INT, 12345, 'test key', false)
        ];
    }

    public function getUserConfigs(): array {
        return [
            new Entry('key1', ValueType::STRING, 'abcde', 'test key', true, IUserConfig::FLAG_SENSITIVE),
            new Entry('key2', ValueType::INT, 12345, 'test key', false)
        ];
    }
}

Each method getUserConfigs() and getAppConfigs() returns a list of \OCP\Config\Lexicon\Entry.

getStrictness() is used to define the expected behavior of the process when reaching a config keys that is not listed in your app’s Config Lexicon. Must returns a value from enum \OCP\Config\Lexicon\Strictness.

Available values:
  • ::IGNORE - does not limit the set/get on an unknown config key.

  • ::NOTICE - does not limit the set/get on an unknown config key, but generate a notice in the logs.

  • ::WARNING - unknown config key will not be set, and get will returns the default value. A warning will be issued in the logs.

  • ::EXCEPTION - set/get on an unknown config key will generate an exception.

Config Lexicon Entry

Each config key is defined in a object through those arguments:

new Entry(
    key: 'my_config_key',        // config key
    type: ValueType::STRING,     // expected value type when the code set/get value
    defaultRaw: 'default value', // value to returns if a config value is not available in the database
    definition: 'this is a description of the use for this config key',
    lazy: true,                  // config value is stored as lazy
    flags: FLAG_SENSITIVE,       // value is sensitive and/or indexable, using IAppConfig::FLAG_*, IUserConfig::FLAG_*
    deprecated: false,           // if set to ``true`` will generate a notice entry in the nextcloud logs when called
);

Note

Unless if set to null, the default value set in the config lexicon overwrite the default value used as argument when calling getValueString('my_config_key', 'another default value');

Preset

With 32, Nextcloud comes with a list of preset to ease the default user experience, based on the context of the instance. The selection of a preset is optional and can be done right after the setup of Nextcloud, and any time in the future using this occ command:

$ ./occ config:preset
current preset: NONE
$ ./occ config:preset PRIVATE
current preset: PRIVATE

If you want your app to have a different default value based on the selected Preset, you need to generate a Closure as $defaultRaw when generating the Lexicon Entry. The first parameter of the Closure is an Enum '\OCP\Config\Lexicon\Preset' that define the current Preset:

new Entry('key3', ValueType::STRING, fn (Preset $p): string => match ($p) {
            Preset::FAMILY => 'family',
            Preset::CLUB, Preset::MEDIUM => 'club+medium',
            default => 'none',
        }),
Available values:
  • ::LARGE - Large size organisation (> 50k accounts)

  • ::MEDIUM - Medium size organisation (> 100 accounts)

  • ::SMALL - Small size organisation (< 100 accounts)

  • ::SHARED - Shared hosting

  • ::EDUCATION - School/University

  • ::CLUB - Club/Association

  • ::FAMILY - Family

  • ::PRIVATE - Private

./occ config:app:get –details

Details from the Lexicon can be extracted using the occ command

$ ./occ config:app:get myapp my_config_key --details
  - app: myapp
  - key: my_config_key
  - value: 'a_value'
  - type: string
  - lazy: true
  - description:
  - sensitive: false