fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: Entity::hasChanged() is unreliable for casts - #6284

Closed
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged
Closed

fix: Entity::hasChanged() is unreliable for casts#6284
kenjis wants to merge 3 commits into
codeigniter4:developfrom
kenjis:fix-Entity-hasChanged

Conversation

@kenjis

@kenjiskenjis commented Jul 21, 2022

Copy link
Copy Markdown
Member

Need to rebase after merging #6285

Description
Fixes#5905

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jul 21, 2022
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from eed96bd to b604cf3CompareJuly 21, 2022 09:11

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes me very uncomfortable. I think we've already established that Entity is rather confusing, and my opinion on how to improve that is to separate "data source logic" from "developer logic" and keep Entity methods as a way of traversing those realms.

hasChanged() is a data source logic method that I interpret as: "does this instance still correctly represent its originating data?" Casting is a developer logic method: "no matter the underlying data type, represent it like this." This works great as a read-only Database Transfer Object (DTO) but the problem comes when we allow modifying attributes (technically breaks the DTO design pattern). Since sweeping changes are off the table, the way to keep this clean is to keep set methods as data source logic methods which means they need to remain ignorant of the developer representation of the data. Altering hasChanged() to compare developer representations of the underlying data source is mixing the two sides of logic in an unhelpful way.

A silly example... I want to anonymize my user data so I define a new JoeCast:

publicfunctionget(): string
{
return'Joe';
}

Then I apply it to my user's names:

class User extends Entity
{
protected$casts = [
'firstname' => 'joe',
];
}

Now I can use my developer logic safely anywhere I want to display a user: <?= $user->firstname ?>. However, this sequence of methods that are entirely data source logic now fails:

$user->firstname = 'Jill';
model(UserModel::class)->save($user);

Comment threadsystem/Entity/Cast/BaseCast.php Outdated
@MGatner

MGatner commented Jul 21, 2022

Copy link
Copy Markdown
Member

Addendum, since most of the discussion so far has been about typing (e.g. 35 versus '35')... Entity is mildly tied to Model (notBaseModel) in that the hasChanged() methods affect database interactions. Since Model is inherently SQL-based there is an impulse to assume Entity is a representation of SQL data but I would argue that this is a big violation.

My guess is this assumption is what is mostly behind the "35 age" example we've been using: since the SQL column data type cannot change we are safe to manipulate types in developer logic. However as soon as the data source becomes collection, array store, NoSQL database, JSON file, etc... that assumption will wreak havoc.

@kenjis
kenjis marked this pull request as draft July 22, 2022 01:48
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from b604cf3 to 8849e4dCompareJuly 22, 2022 01:53
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch 2 times, most recently from 74bf6bf to 9c179adCompareAugust 31, 2022 09:08
Comment threadsystem/Entity/Entity.php
@kenjiskenjis added the stale Pull requests with conflicts label Aug 16, 2023
@kenjis
kenjisforce-pushed the fix-Entity-hasChanged branch from 9c179ad to 2136183CompareSeptember 23, 2023 05:19
@kenjiskenjis removed the stale Pull requests with conflicts label Sep 23, 2023
@MGatner

Copy link
Copy Markdown
Member

@kenjis What's the update here?

@kenjis

kenjis commented Sep 27, 2023

Copy link
Copy Markdown
MemberAuthor

Just rebased to resolve conflicts.

Since Entity is designed to have "raw data" (values retrieved from a database), it is difficult to determine if the value as PHP has changed. Raw data can change depending on the database driver and/or configuration.

@kenjiskenjis closed this Sep 29, 2023
@kenjiskenjis mentioned this pull request Sep 30, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

@MGatner I sent a brand new PR #7995

@kenjis
kenjis deleted the fix-Entity-hasChanged branch September 30, 2023 02:36
@kenjiskenjis mentioned this pull request Nov 24, 2023
5 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Entity::hasChanged() is unreliable for casts

3 participants

@kenjis@MGatner@najdanovicivan