Žiadne názvy tried v API
Väčšina hostiteľských aplikácií nemá morph mapu, takže stĺpec *_type obsahuje App\Models\User — a ak ho pošlete klientovi, prezradíte štruktúru menných priestorov hostiteľa a naviažete na ňu jeho API. Každý súvisiaci model preto vykreslite cez referenčný resource s {id, type: class_basename} a pripnite to cez toExposeNoClassNames() — alebo Assert::exposesNoClassNames() v čistom PHPUnit:
use Illuminate\Database\Eloquent\Relations\Relation;
use RoundlyConsulting\Testing\Assert;
it('renders the author without a class name', function (): void {
Relation::morphMap([], merge: false); // no morph map, like most hosts
$resource = new CommentResource($comment->load('author'));
expect($resource)->toExposeNoClassNames(); // the response body, wrapping included
expect($this->getJson('/comments'))->toExposeNoClassNames(); // a TestResponse
expect($payload)->toExposeNoClassNames(); // an array or a JSON string
Assert::exposesNoClassNames($payload); // plain PHPUnit
});Čo prečíta
| Vstup | Prečíta sa ako |
|---|---|
| Reťazec JSON | Dekódovaný; reťazec, ktorý nie je JSON, vyhodí InvalidArgumentException. |
| Pole | Payload tak, ako je. |
JsonResource | toResponse(request()) — telo, ktoré dostane klient, vrátane obalenia do data, with() a additional(). |
Response / JsonResponse / TestResponse | Telo odpovede, dekódované. |
Čokoľvek iné — int, obyčajný objekt — vyhodí InvalidArgumentException.
Čo zlyhá
Kontroluje sa každý kľúč a každá reťazcová hodnota v ľubovoľnej hĺbke a každý únik sa uvedie s cestou (data.author.type), nielen prvý:
- Názov triedy s menným priestorom kdekoľvek — App\Models\User, \App\Models\User, kópia zakódovaná do JSON vnútri reťazca, názov v texte (No query results for model [App\Models\User]) aj názov použitý ako kľúč. Stačí tvar Vendor\Name v StudlyCase; reťazec malými písmenami sa počíta, ak trieda naozaj existuje.
- Kľúč *_type s triedou, nahlásený ako morph stĺpec — vrátane globálnej triedy bez menného priestoru, ktorý by ju prezradil ("subject_type": "ArrayObject").
- Nie je čo kontrolovať. Prázdny reťazec, {}, [], null, prázdny resource alebo odpoveď bez tela zlyhá: payload bez jedinej hodnoty nedokazuje, že sa niečo vykreslilo.
// Passes — a reference resource's basename, and morph aliases
expect(['id' => 1, 'type' => 'User'])->toExposeNoClassNames();
expect(['subject_type' => 'post', 'payment_type' => 'card'])->toExposeNoClassNames();
// Fails — every leak listed with its path
expect(['data' => ['author' => ['id' => 1, 'type' => 'App\Models\User']]])->toExposeNoClassNames();
// `data.author.type` holds the class name `App\Models\User`
expect(['commentable_type' => 'App\Models\Post', 'commentable_id' => 3])->toExposeNoClassNames();
// the morph type column `commentable_type` holds the class name `App\Models\Post`
expect(['subject_type' => 'ArrayObject'])->toExposeNoClassNames();
// the morph type column `subject_type` holds the class name `ArrayObject`
expect(['message' => 'No query results for model [App\Models\User] 5'])->toExposeNoClassNames();
// `message` holds the class name `App\Models\User`
// Fails — nothing to check
expect([])->toExposeNoClassNames();
// There is nothing to check: the payload is empty, so "it exposes no class names" would pass
// without anything having rendered. Assert on the populated payload.Čo prejde
- Vlastné {"id": 1, "type": "User"} referenčného resource — type nie je stĺpec *_type a základný názov triedy nemá menný priestor.
- Morph alias v stĺpci *_type ("commentable_type": "post").
- Skalárne hodnoty, hodnoty null, URL a cesty s lomkami.
Obmedzenia
- Cesta vo Windows (C:\Users\Jane) vyzerá ako názov triedy a zlyhá — je to únik sám osebe.
- Kontroluje to, čo dostane. Interné formáty na spiatočný prenos — exporty, výkazy účtovnej knihy, payloady vo fronte — pravidlo nemusia spĺňať; nesmerujte ju na ne.
- Podmienku „bez morph mapy“ za vás nenastaví: v teste morph mapu vyprázdnite, inak môže payload obsahovať alias, ktorý zakryje, čo by videl hostiteľ bez nej.
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.