NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Package Toolkit for Laravel

Validácia konfigurácie

Config dodáva opakujúci sa mechanizmus — prečítať kľúč, overiť jeho tvar a pri nesprávnej konfigurácii viditeľne zlyhať — pričom doménové hranice zostávajú vo vašom kóde. Každý čítač je prísny: predvolená hodnota platí len pre nenastavený kľúč — chýbajúci, null alebo prázdny ('' či len medzery, čo vznikne z riadka KEY= u hostiteľa) — a každá iná neplatná hodnota vyhodí InvalidConfigurationException s názvom kľúča aj hodnoty. Statické čítače čítajú globálny konfiguračný repozitár:

use RoundlyConsulting\PackageToolkit\Support\Config;

// Strict config readers: the default applies only to a key that is not set (absent, null, or
// blank like a host's KEY=); an invalid value throws InvalidConfigurationException naming
// the key and the value.
Config::integer('comments.per_page', 20, min: 1, max: 100);                 // '20' → 20; '' → 20; 'five', '5.5', '1e3' throw
Config::requireString('comments.table');                                    // not set (absent or blank) throws missing
Config::enum('comments.hash_algo', HashAlgorithm::class);                   // no default: missing throws too
Config::enum('comments.sort', Sort::class, Sort::Newest);                   // absent → Sort::Newest; 'neweset' throws
Config::oneOf('comments.renderer', ['markdown', 'plain'], 'markdown');      // absent → 'markdown'; 'html' throws
Config::boolean('comments.allow_guests', false);                            // 'on'/'off' etc.; 'ture' throws
PrístupNenastavená (chýba, null alebo prázdna)Hodnota neplatná
integer(string $key, int $default, ?int $min = null, ?int $max = null)Vráti $default — s rovnakou kontrolou rozsahu ako každá iná hodnota.Vyhodí výnimku, ak nejde o int ani o kanonické celé číslo v reťazci ('30', '-5', ' 30 '); 'five', '5.5', '1e3' či pretekajúce číslo neprejdú a rovnako ani hodnota mimo $min / $max.
requireString(string $key)Vyhodí missing — povinná hodnota nie je nastavená; prázdny reťazec alebo reťazec len z medzier sa počíta ako nenastavený.Pre čokoľvek, čo nie je reťazec (int, bool, pole), vyhodí notAString.
enum(string $key, string $enum, ?BackedEnum $default = null)Vráti $default; bez predvolenej hodnoty vyhodí výnimku.Vyhodí výnimku so zoznamom povolených hodnôt — aj vtedy, keď je predvolená hodnota zadaná. Prípad enumu prejde; hodnota sa porovná presne a s rozlíšením veľkosti písmen po prevode na typ, ktorým je enum podložený.
oneOf(string $key, array $allowed, string $default)Vráti $default — ten však musí byť v $allowed.Vyhodí výnimku so zoznamom $allowed, ak nejde o reťazec z neho (presne, s rozlíšením veľkosti písmen).
boolean(string $key, bool $default = false)Vráti $default.Vyhodí výnimku, ak nejde o true / 1 / on / yes alebo false / 0 / off / no (bez ohľadu na veľkosť písmen, orezané).

Každá správa má rovnaký tvar — Configuration value [comments.per_page] must be between 1 and 100, [500] given. — takže kľúč aj chybnú hodnotu máte vždy priamo pred sebou.

Celé čísla

Každá hodnota z env je reťazec, preto integer() prijme int alebo kanonické celé číslo v reťazci: voliteľné -, desiatkové číslice, okolité medzery sa ignorujú ('30', '-5', ' 30 '). Prázdne '' sa počíta ako nenastavené a vráti predvolenú hodnotu. Odmietne to, čo by hrubé pretypovanie (int) potichu zmenilo na iné číslo — 'five', '5.5', '5abc', '1e3', '0x10', '+5', pretekajúce číslo, float, bool aj pole vyhodia výnimku. Kontrola rozsahu $min / $max platí aj pre predvolenú hodnotu:

use RoundlyConsulting\PackageToolkit\Support\Config;

// .env: COMMENTS_PER_PAGE=" 30 " — surrounding whitespace is ignored
Config::integer('comments.per_page', 20, min: 1, max: 100);   // 30

// COMMENTS_PER_PAGE unset, or blank (COMMENTS_PER_PAGE=) — not set, so the default,
// range-checked like any other value
Config::integer('comments.per_page', 20, min: 1, max: 100);   // 20

// .env: COMMENTS_PER_PAGE=1e3 — not a canonical integer string
Config::integer('comments.per_page', 20, min: 1, max: 100);
// throws: Configuration value [comments.per_page] must be an integer, [1e3] given.

// .env: COMMENTS_PER_PAGE=500 — out of range
// throws: Configuration value [comments.per_page] must be between 1 and 100, [500] given.

Enumy a pevné slovníky

enum() prijme prípad enumu alebo jeho hodnotu, porovnanú presne a s rozlíšením veľkosti písmen ('UUID' sa nezhoduje s 'uuid'). Hodnota sa najprv prevedie na typ, ktorým je enum podložený — '2' nájde prípad enumu podloženého typom int (podľa pravidiel pre celé čísla vyššie) a int nájde číselný prípad enumu podloženého reťazcom. Čokoľvek iné vyhodí výnimku so zoznamom povolených hodnôt, aj keď je predvolená hodnota zadaná; TypeError nikdy neunikne. oneOf() má rovnaký kontrakt pre obyčajný slovník reťazcov bez enumu:

use RoundlyConsulting\PackageToolkit\Support\Config;

enum Priority: int
{
    case Low = 1;
    case High = 2;
}

// .env: COMMENTS_PRIORITY=2 — every env value is a string
Config::enum('comments.priority', Priority::class);                     // Priority::High

// .env: COMMENTS_PRIORITY=2.0 — not a canonical integer string, so it names no case
Config::enum('comments.priority', Priority::class, Priority::Low);      // throws — a default never stands in for a typo
Config::enum('comments.priority', Priority::class);                     // throws InvalidConfigurationException

Nenastavená verzus neplatná hodnota

Prázdna hodnota nie je preklep: '' alebo len medzery — čo vznikne z riadka KEY= u hostiteľa — sa počíta ako nenastavená a dostane predvolenú hodnotu rovnako ako chýbajúci kľúč. requireString() — a enum() volaný bez predvolenej hodnoty — sa nemá k čomu vrátiť, preto tam prázdna hodnota vyhodí missing. Predvolená hodnota však nikdy nezakryje preklep. Hodnota z env, ktorá je zadaná, no nesprávna — preklep v enume, boolean zapísaný ako 'disabled', renderer mimo slovníka — zastaví aplikáciu so správou s názvom kľúča aj hodnoty, namiesto toho, aby sa potichu použila predvolená hodnota:

use RoundlyConsulting\PackageToolkit\Enums\KeyType;
use RoundlyConsulting\PackageToolkit\Support\Config;

// config('comments.key_type') === 'uudi' — a typo
Config::enum('comments.key_type', KeyType::class, KeyType::BigInt);
// throws InvalidConfigurationException — the default covers only a key that is not set:
// Configuration value [comments.key_type] must be one of [bigint, uuid, ulid], [uudi] given.

// .env: COMMENTS_ALLOW_GUESTS=disabled
Config::boolean('comments.allow_guests', false);
// throws InvalidConfigurationException:
// Configuration value [comments.allow_guests] must be a boolean (true/false, 1/0, on/off or yes/no), [disabled] given.

// config('comments.renderer') === 'html'
Config::oneOf('comments.renderer', ['markdown', 'plain'], 'markdown');
// throws InvalidConfigurationException:
// Configuration value [comments.renderer] must be one of [markdown, plain], [html] given.

Validácia vstupu DTO

Statické prístupy čítajú globálny konfiguračný repozitár podľa kľúča. Keď DTO overuje pole, ktoré dostalo (fromArray()), čítanie repozitára by prepustilo hodnotu, ktorú volajúci vôbec neodovzdal — preto spustite validátor naviazaný na toto pole cez Config::for(). Kľúče podporujú bodkovú notáciu. Ako druhý argument uveďte vlastnú triedu výnimky vášho balíka a chybná konfigurácia sa prejaví cez vašu hierarchiu, nie cez hierarchiu toolkitu:

use RoundlyConsulting\PackageToolkit\Support\Config;

final readonly class PasskeyConfig
{
    public static function fromArray(array $config): self
    {
        $v = Config::for($config, PasskeyException::class);

        return new self(
            timeout: $v->integer('timeout', 60, min: 1, max: 300), // validates the 99999 you were handed
            trust: $v->enum('attestation', TrustMode::class), // a typo throws PasskeyException, never a silent downgrade
            rpId: $v->requireString('rp_id'),
        );
    }
}

Vlastná výnimka, globálna konfigurácia

Config::using() poskytne rovnaký validátor s určenou výnimkou, ale naďalej číta globálny repozitár — pre konfiguráciu, ktorú balík vlastní celú. Určená trieda musí prijať textovú správu; správa toolkitu sa zachová:

use RoundlyConsulting\PackageToolkit\Support\Config;

$v = Config::using(CommentsException::class);

$perPage = $v->integer('comments.per_page', 20, min: 1, max: 100);
$algo = $v->enum('comments.hash_algo', HashAlgorithm::class);
// a misconfiguration throws CommentsException, carrying the toolkit's message

Obe vracajú ConfigValidator so všetkými čítačmi, ktoré majú statické prístupy — integer(), requireString(), enum(), oneOf() a boolean() — takže aj prepínač v odovzdanom poli viditeľne zlyhá. ConfigValidator::forArray() a ConfigValidator::forRepository() sú konštruktory, na ktorých stoja:

$v = Config::for($config, PasskeyException::class);

$v->boolean('user_verification', true);   // absent or blank → true; 'ture' throws PasskeyException
Config::using(PasskeyException::class)->boolean('passkeys.enabled', false);

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.