Skip to content

Issue #127 (ginkelsoft-development/buildora) bouwen: ModelResolver een statische per-process cache geven zodat resource↔model-resolutie niet herhaald wordt per request. - #184

Open
zyra-ginkelsoft[bot] wants to merge 1 commit into
mainfrom
zyra/issue-127-ginkelsoft-development-buildor-fbb26249
Open

zyra-ginkelsoft[bot] wants to merge 1 commit into
mainfrom
zyra/issue-127-ginkelsoft-development-buildor-fbb26249

Conversation

@zyra-ginkelsoft

Copy link
Copy Markdown
Contributor

Goed, juiste map. Nu ModelResolver bekijken en aanroeppunten.Geen bestaande tests. Laten we tests directory structuur bekijken om stijl te volgen.Geen bestaande conventie. Ik maak een kleine fixture-map binnen tests/Support.Nu de test schrijven.Nu de testsuite draaien.Alles slaagt. Nu phpstan draaien.Geen fouten gerelateerd aan mijn wijzigingen. Laten we bevestigen dat deze 12 fouten al bestonden vóór mijn wijziging (baseline op main).Bevestigd: precies dezelfde 12 pre-existing fouten, niks nieuws geïntroduceerd. Nu de lint/codesniffer draaien indien beschikbaar.Schoon voor mijn bestand. Nu proefdraaiscript checken.Het bestaat al en is toegesneden op deze package-repo. Even snel valideren dat het werkt.Werkt prima (timeout na 40s omdat serve blijft draaien, verwacht gedrag). Nu committen.## Samenvatting

Wat: ModelResolver::resolve() deed per aanroep opnieuw method_exists/property_exists-checks, de config-lookup voor models_namespace en de BuildoraValidator-validatie — ook al is de uitkomst voor een gegeven resourceClass altijd hetzelfde binnen één process (bv. meerdere BuildoraResource-instanties per request). Ik heb een private static array $cache toegevoegd; de bestaande logica is verplaatst naar doResolve(), en resolve() is nu self::$cache[$resourceClass] ??= self::doResolve($resourceClass). Bij een exception (bv. BuildoraException uit de validator) wordt er niets gecached, dus foutgedrag blijft ongewijzigd. Er is ook clearCache() toegevoegd voor tests.

Waarom: issue #127 — resource↔model-resolutie hoeft niet elke keer herhaald te worden binnen hetzelfde process.

Getest:

  • Nieuwe testklasse tests/Unit/Resources/ModelResolverTest.php met fixtures (tests/Fixtures/ModelResolverCacheTest{Model,Resource,ResourceTwo}.php) die een modelClass()-aanroepteller bijhouden:
    • basisresolutie is correct
    • herhaalde resolve()-aanroepen roepen modelClass() maar één keer aan (cache-hit)
    • twee verschillende resourceklassen krijgen elk hun eigen cache-entry (geen state-lek tussen resources)
    • clearCache() forceert opnieuw resolven
  • Volledige testsuite: 40 tests, alles groen (vendor/bin/phpunit)
  • composer analyse (phpstan level 5 op src/): geen nieuwe meldingen t.o.v. baseline (12 pre-existing, ongerelateerd aan ModelResolver.php, geverifieerd via git stash)
  • composer lint (phpcs PSR12): ModelResolver.php en de nieuwe testbestanden komen niet voor in de output, geen nieuwe issues
  • .zyra/proef.sh bestond al en werkt (Testbench-app start op gekozen $PORT, migraties draaien); niet aangepast

Nog open:

  • De cache is ongebonden qua grootte (groeit met het aantal unieke resourceklassen), maar dat aantal is in de praktijk klein en statisch per applicatie, dus dat is bewust geen probleem.
  • Geen wijzigingen aan callers nodig; BuildoraResource gebruikt ModelResolver::resolve() al op de juiste manier.

resolve() deed voorheen bij elke aanroep opnieuw method_exists/
property_exists-checks, de config-lookup voor de namespace en de
BuildoraValidator-validatie, ook al is de uitkomst voor een gegeven
resourceClass altijd hetzelfde binnen één process. Dat werk wordt nu
één keer per resourceClass gedaan en daarna uit een static array
gecached (private static array $cache, resolve() -> ??= doResolve()).

clearCache() toegevoegd zodat tests state kunnen resetten en de cache
niet ongewenst tussen testcases lekt.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants