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 — fineVý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 onlyVlastné 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 kryptomienOdoslaní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.