[9.x] Refactor for missing attributes #44876
Closed
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.
The changes below allow developers to use the traits
HasAttributes
,RestrictsAttributes
,UsesTimestamps
themselves in custom classes, therefore creating a model with a subset of components. For example, I am using this in my own project to create aCountry
model disconnected from a database (the country attributes are loaded in-code since it never changes in my situation) while still allowing all the handy stuff fromHasAttributes
like mutators.Moved functionality of [9.x] Opt-in
Model::preventAccessingMissingAttributes()
option #44283 (Opt-in Model::preventAccessingMissingAttributes() option) to a new traitRestrictsAttributes
instead of it being spread out inHasAttributes
andIlluminate\Database\Eloquent\Model
. This increases modularity greatly and allows developers to use these traits themselves.Changed
HasAttributes
trait so it has no dependencies on theRestrictsAttributes
trait (that is: functions from this trait have to be checked first usingmethod_exists()
before being called. Not having theRestrictsAttributes
trait thus reverts the behaviour to before PR [9.x] Opt-inModel::preventAccessingMissingAttributes()
option #44283 ).Changed
HasAttributes
trait to have no dependencies on theUsesTimestamps
trait.Moved
__get()
and__set()
fromEloquent\Model
to the very top of theHasAttributes
trait since it calls exactly those functions contained in that trait.Changed the order of the if-statement (
a && b && c
) inthrowMissingAttributeExceptionIfApplicable()
so it doesn't break on the calls$this->exists && !$this->wasRecentlyMerged
since these properties are not part of the trait (and therefore may be undefined depending on where you include this trait). Now, theself::preventsAccessingMissingAttributes()
is called first which by default returnsfalse
therefore ending the if-statement. This only increases stability sincea && b && c
can be rearranged in any way, but in this situation there is 1 case that is better being called first.Included tests to show that these traits can be used mostly independently. There are still some dependencies from
HasAttributes
toHasRelations
left in the code (and probably some other traits as well) but I have not included those changes in this PR.