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

Výnimky z presetov

Zoznam výnimiek prijíma päť presetov — strictTypes, finalByDefault, noLocalCryptoPrimitives, noDebuggingLeftovers a modelsGoThroughTheFacade. Zadávajte ho cez parameter $ignoring: takto odovzdané položky sa kontrolujú proti zastaraniu, pretože diera, ktorá sa tvári ako pokrytie, je horšia než žiadne pokrytie.

ArchPresets::finalByDefault('RoundlyConsulting\Shops\Actions', [SomeBase::class]);
ArchPresets::noLocalCryptoPrimitives('RoundlyConsulting\Passkeys', ['RoundlyConsulting\Passkeys\Attestation']);
ArchPresets::noDebuggingLeftovers(['RoundlyConsulting\Shops\Debug\Inspector']);

Položka zlyhá, keď:

  • Nepomenúva nič existujúce — žiadnu triedu, rozhranie, trait ani enum a ani menný priestor s PHP súbormi: preklep alebo výnimka, ktorá prežila triedu, kvôli ktorej vznikla.
  • Existuje, no nezodpovedá ničomu, čo preset prehľadáva — skutočná trieda z iného menného priestoru odovzdaná strictTypes, finalByDefault či noLocalCryptoPrimitives alebo položka noDebuggingLeftovers, ktorej nezodpovedá žiadna trieda deklarovaná v jeho $srcDir.
  • Pri modelsGoThroughTheFacade nevyníma žiadnu triedu, ktorá pravidlo porušuje.

Neodhalí sa položka s triedou, ktorá pravidlo už spĺňa, napríklad trieda, ktorá už je final, v zozname finalByDefault. Dnes nič nerobí, no v deň, keď trieda pravidlo prestane spĺňať, zákaz ticho znova otvorí — zoznamy preto obmedzte na triedy, ktoré výnimku naozaj potrebujú.

Parameter, nie ->ignoring()

Tri presety postavené na arch vrstve Pestu vracajú pôvodnú arch expectation, takže fluentné ->ignoring() z Pestu na ne stále funguje — lenže sa nekontroluje:

// Checked: a stale or misspelled entry FAILS.
ArchPresets::finalByDefault('RoundlyConsulting\Shops\Actions', ['RoundlyConsulting\Nope']);

// NOT checked: the identical bogus entry passes green, silently.
ArchPresets::finalByDefault('RoundlyConsulting\Shops\Actions')->ignoring('RoundlyConsulting\Nope');

Túto medzeru priznávame namiesto záplaty: ->ignoring() je vlastná metóda Pestu na internom objekte, ktorého deštruktor expectation vyhodnocuje, a vkliniť balík medzi ne by hrozilo, že arch test ticho prestane bežať. Výnimky navyše platia pre triedu, nie pre funkciu — vylúčenie triedy kvôli jednému volaniu uvoľní celý zákaz pre celú triedu, preto ho obmedzte na najmenšiu triedu, ktorá ho naozaj potrebuje.

Viac zoznamov v jednom súbore

Každý preset registruje kontrolu svojich výnimiek pod vlastným popisom, takže jeden arch súbor môže mať toľko zoznamov, koľko presetov:

ArchPresets::finalByDefault('RoundlyConsulting\Shops', [ShopException::class]);
ArchPresets::noDebuggingLeftovers([Resource::class]); // a second list — fine

Výnimky sa porovnávajú podľa prefixu

Pest triedu vylúči, ak jej plne kvalifikovaný názov začína reťazcom výnimky — ide o test prefixu, nie o identitu triedy. Vylúčenie jednej triedy tak ticho vylúči každú triedu, ktorej názov začína rovnakými znakmi:

ArchPresets::finalByDefault('RoundlyConsulting\Purchases', [Stripe::class]);
// …also silences StripeClient — without the shadow re-check, removing its final would stay green.

finalByDefault to pri zadaní $ignoring uzavrie: reflexiou znova overí každú triedu, ktorú vaše výnimky umlčia bez toho, aby ju menovali. Zatienená trieda, ktorá už je final, zostane zelená; tá, ktorá nie je, zlyhá a uvedie triedu aj výnimku, ktorá ju skryla:

These classes are not final, and `finalByDefault` cannot see them:
  - RoundlyConsulting\Metrics\MetricsManager (hidden by the exemption RoundlyConsulting\Metrics\Metrics)

Ak má zatienená trieda naozaj zostať otvorená, uveďte ju v $ignoring — stane sa z toho explicitné rozhodnutie, ktoré možno skontrolovať. Výnimky na celý menný priestor zostávajú nedotknuté, keďže vylúčenie podstromu je zámerné. Táto náprava funguje len s parametrom; ak musíte použiť fluentný tvar, zoznam si uložte do premennej a odovzdajte ho aj shadowedClassesAreFinal():

$ignoring = [Github::class, Batch::class];

ArchPresets::finalByDefault('RoundlyConsulting\Git')->ignoring($ignoring);
ArchPresets::shadowedClassesAreFinal('RoundlyConsulting\Git', $ignoring); // fluent form only

Vlastné pravidlá

Pri vlastnom arch pravidle zavolajte exemptionsExist() priamo. $for pomenúva pravidlo — vývojár ho uvidí, keď kontrola zlyhá, a zároveň odlišuje dve kontroly v jednom súbore. Ako $within odovzdajte menný priestor, ktorý vaše pravidlo prehľadáva, a každá položka musí zodpovedať aj niečomu v ňom:

ArchPresets::exemptionsExist($ignoring, 'no facades outside the facade layer');

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.