I have some Drupal classes that provide wrapper functionality for entities, which are initialized by a closure (anonymous function) following the class declaration as follows:
<?php
namespace Drupalmysite_standingWrapper;
use Drupalmysite_baseEntityWrapper;
use Drupalmysite_baseQueryQueryHelper;
use DrupaluserEntityUser;
class Standing extends EntityWrapper {
// singletons for Standings
private static $active_standing;
private static $lapsed_standing;
private static $dropped_standing;
//===========================================================================
// ENUMERATION METHODS
//===========================================================================
public static function active() {
return self::$active_standing;
}
public static function lapsed() {
return self::$lapsed_standing;
}
public static function dropped() {
return self::$dropped_standing;
}
//===========================================================================
// FACTORY METHODS
//===========================================================================
public static function fromUser(User $user): Standing {
$stand = $user->get('field_user_implicit_standing')
->referencedEntities()[0];
return new Standing($stand);
}
//===========================================================================
// BOOLEAN METHODS
//===========================================================================
//===========================================================================
// INITIALSATION METHODS
//===========================================================================
private static function initEnum() {
self::$active_standing = new Standing(QueryHelper::queryTermForVocabAndName('standing', 'Active'));
self::$lapsed_standing = new Standing(QueryHelper::queryTermForVocabAndName('standing', 'Lapsed'));
self::$dropped_standing = new Standing(QueryHelper::queryTermForVocabAndName('standing', 'Dropped'));
}
//===========================================================================
// EXTERNALISATION METHODS
//===========================================================================
public function jsonSerialize() {
return [
'label' => $this->entity->label(),
];
}
}
(static function () {
static::initEnum();
})->bindTo(NULL, Standing::class)();
I am in the process of upgrading the site to Drupal 9, and would like to convert these classes to using standard Drupal constructors so that dependency injection of required services is possible in future.
Is anyone able to give me advice on how to convert the functionality provided by the closure to a standard "__construct()" method.
The parent class provides a standard method as follows:
protected $entity;
//===========================================================================
// CONSTRUCTOR
//===========================================================================
public function __construct(EntityInterface $entity) {
$this->entity = $entity;
}
Perhaps I can clarify my question to be:
What is the closure function actually doing?
I am not familiar enough with PHP to fully understand what is happening, but once I do understand, then I can probably write a standard constuctor method.
This question is not really about dependency injection, as I understand that quite well. Dependency inject was only mentioned as a possible future enhancement to the class.