Action class variables should not be accessed directly. Functions should be use to access the variable. For instance use getDescription() and setDescription($description) for the protected class variable description. For a boolean variable the getter function becomes isVariableName(). In object-oriented programming this is called encapsulation.

Remaining tasks

  • Update the class variables and make them protected.
  • Create getters and setters for frequently used get and set functionality.
  • Update drupal to use the getters and setters instead of accessing variables directly.
  • There are no tests required because the added functions are only getters and setters.

For more info over what should be done see the issue summary of #2016679: Expand Entity Type interfaces to provide methods, protect the properties.

Beta phase evaluation

Reference: https://www.drupal.org/core/beta-changes
Issue category Bug because properties should not be public, API methods should not be allowed to be sidestepped.
Issue priority Major because this meta goes across the entire system. But each child will be a normal bug.
Prioritized changes Prioritized since it is a bug and it reduces fragility.
Disruption Somewhat disruptive for core as well as contributed and custom modules:
  • BC break for anything using the public properties: code will need to convert to the methods
  • BC break for anything (mis)using properties that should not really be public: will require minor refactoring
  • BC break for alternate implementations of a given entity interface (rare/probably nonexistent): they will need to implement the new methods

But impact will be greater than the disruption, so it is allowed in the beta.

CommentFileSizeAuthor
#11 9394699-11.patch532 bytesareke
#8 2384539-8.patch8.1 KBareke
#5 protect-2384539-5.patch1.17 KBareke
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

daffie’s picture

I would like to get this fixed. So I will do a good review for posted patches.

daffie’s picture

Issue summary: View changes

The class variables $id and $label need to become protected.
You can use the functions id() as a getter function for the $id variable and label() as a getter function for the variable $label.

daffie’s picture

The action entity is defined in the system module.

areke’s picture

Assigned: Unassigned » areke
areke’s picture

Status: Active » Needs review
FileSize
1.17 KB

Let's try this.

daffie’s picture

+++ b/core/modules/system/src/Entity/Action.php
@@ -87,6 +87,36 @@ protected function getPluginCollection() {
+  public function label() {
+    return $this->get('label');
+  }
...
+  public function id() {
+    return $this->get('id');
+  }

These functions are inherited from the Entity class. So they can be removed.

+++ b/core/modules/system/src/Entity/Action.php
@@ -87,6 +87,36 @@ protected function getPluginCollection() {
+  public function setLabel($label) {
+    $this->set('label', $label);
+    return $this;
+  }
...
+  public function setId($id) {
+    $this->set('id', $id);
+    return $this;
+  }

These functions are not used. You can remove them and use set('id', $value) and set('label', $value).

daffie’s picture

Status: Needs review » Needs work
areke’s picture

Status: Needs work » Needs review
FileSize
8.1 KB
areke’s picture

Status: Needs review » Needs work
daffie’s picture

@areke: Something went wrong with creating your last patch. :(

areke’s picture

Status: Needs work » Needs review
FileSize
532 bytes

The last submitted patch, 8: 2384539-8.patch, failed testing.

daffie’s picture

Status: Needs review » Reviewed & tested by the community

All the class variables are protected.
There are already getter functions available, so no need for new ones.
The test-server give it green.
It all looks good to me, so for me it is RTBC.

craigsilk’s picture

Out of curiosity, was / is there any code that sets these variables directly rather than through the inherited get() and set() methods?

daffie’s picture

@craigsilk: The getter function for the variable $id is id() and the getter for the variable $label is label(). If you want to set the variable $id or $label you must use the set() function.

alexpott’s picture

Status: Reviewed & tested by the community » Fixed

Committed 7ee91de and pushed to 8.0.x. Thanks!

Thanks for adding the beta evaluation for to the issue summary.

  • alexpott committed 7ee91de on 8.0.x
    Issue #2384539 by areke: Make the class variables protected for Action
    

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.