refactor: extract HasResourceFields trait (closes #135 after merge)#175
Merged
ginkelsoft-development merged 1 commit intoMay 12, 2026
Merged
Conversation
4 tasks
Fourth and final decomposition step for #135. After this, every overridable resource hook lives in a dedicated trait under Resources\Concerns and the BuildoraResource class itself shrinks from ~355 lines to ~150 — covering only constructor, state declarations, model resolution, panel relations, detail-view configuration and the abstract defineFields() contract. This PR moves four methods covering field state management into Resources\Concerns\HasResourceFields: - fill(Model) — populate every field's value/displayValue from a model - setFields(array) — replace the field collection with type validation - getFields() — read the field collection with the same defensive Field-type check - resolveFields($model) — re-prepare the fields for a specific model via FieldManager::prepare The abstract defineFields(): array contract stays on BuildoraResource. Abstract hooks declared via a trait are harder to discover (PHPStorm doesn't surface them as 'implement me' candidates when you extend the class), and the subclass-implementation contract is the resource's defining feature — it belongs on the resource itself. State access: the trait reads/writes $this->fields and $this->parentModel, both protected properties declared on BuildoraResource. PHP allows that without re-declaration in the trait. Tests (7): - getFields() returns the declared fields - fill() sets the value on the field from the model attribute - setFields() throws BuildoraException on non-Field entries - setFields() accepts a valid Field[] array - resolveFields($model) re-prepares fields for that model - BuildoraResource uses the trait (reflection) - Source-grep both files: methods present in the trait, absent from BuildoraResource.php. defineFields stays on the resource (abstract). After #172, #173, #174 and this PR are merged, #135 is closed. Refs #135
ginkelsoft-development
force-pushed
the
refactor/extract-resource-fields-trait
branch
from
May 12, 2026 13:15
a4916f9 to
a05a8bf
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Vierde en laatste decomposition stap voor #135
Volgt op PR #172 (HasResourceActions), PR #173 (HasResourceNavigation), PR #174 (HasResourceQuery).
Na merge van alle vier de PRs: #135 is volledig opgelost.
BuildoraResourceis gestript van ~355 regels naar ~150, met elke concern in eigen trait + dedicated tests.Wijziging
src/Resources/Concerns/HasResourceFields.php(nieuw) bevat 4 methodes voor field state management:fill(Model)setFields(array)getFields()resolveFields(\$model)BuildoraResourcegebruikt nuuse HasResourceFields;. De abstractdefineFields(): arrayblijft bewust op BuildoraResource — een abstract hook in een trait is moeilijker te ontdekken door IDEs (geen "implement me" suggestion bij class extension), en is conceptueel de definiërende eigenschap van de resource.State access
De trait leest/schrijft
\$this->fieldsen\$this->parentModel— beide protected properties opBuildoraResource. PHP staat dit toe zonder herdeclaratie.Tests — 7 tests, 16 asserties
Behavioural (5)
getFields()returnt de declared fieldsfill(\$model)zet field-value op de model-attribute (sqlite-backed)setFields()gooitBuildoraExceptionop non-Field entriessetFields()accepteert validField[]arrayresolveFields(\$model)re-prepared fields voor een specifiek modelStructural (2)
BuildoraResourcegebruikt de traitBuildoraResource.php, present in traitEindstand #135
Totaal: 16 methodes uit BuildoraResource gemoved, elk in een trait waar ze conceptueel thuishoren. Bij het lezen van BuildoraResource zelf zie je alleen nog: constructor, state declarations, model resolution glue (
getModelInstance/getModelClass/relation panels), detail-view configuratie, en de abstractdefineFields()hook.Closes #135 (na merge van #172, #173, #174 én deze)