Quikie 04 : Simplifiez vos constructeurs avec la Property Promotion
- 13 Septembre 2026
- 3 min de lecture
L’injection de dépendances est omniprésente dans Drupal. Services, contrôleurs, formulaires… nos classes peuvent rapidement se retrouver avec des constructeurs contenant beaucoup de code répétitif.
L'essentiel à retenir
La Constructor Property Promotion permet de déclarer et d’initialiser une propriété directement dans les paramètres du constructeur. Particulièrement pratique avec l’injection de dépendances dans Drupal, elle réduit le code répétitif et améliore la lisibilité de vos classes, sans modifier leur fonctionnement.
Prenons un exemple classique avec l’injection de l’Entity Type Manager :
use Drupal\Core\Entity\EntityTypeManagerInterface;
class Example {
/**
* The entity type manager.
*/
protected EntityTypeManagerInterface $entityTypeManager;
/**
* Constructs an Example object.
*/
public function __construct(
EntityTypeManagerInterface $entity_type_manager,
) {
$this->entityTypeManager = $entity_type_manager;
}
}Pour une seule dépendance, cela reste raisonnable. Mais avec quatre ou cinq services injectés, les déclarations de propriétés et les affectations dans le constructeur commencent à prendre beaucoup de place.
La même chose en beaucoup plus simple
Depuis PHP 8, la Constructor Property Promotion permet de déclarer directement une propriété dans les paramètres du constructeur :
use Drupal\Core\Entity\EntityTypeManagerInterface;
class Example {
public function __construct(
protected EntityTypeManagerInterface $entityTypeManager,
) {}
}C'est tout.
L'ajout de protected devant le paramètre indique à PHP qu'il doit également créer une propriété $entityTypeManager et lui affecter automatiquement la valeur reçue.
Dans le reste de notre classe, rien ne change :
$this->entityTypeManager
->getStorage('node')
->load($nid);Encore plus intéressant avec plusieurs services
Le gain devient beaucoup plus visible lorsque notre classe possède plusieurs dépendances.
Au lieu d'écrire les propriétés, puis de répéter chaque affectation :
$this->entityTypeManager = $entity_type_manager;
$this->currentUser = $current_user;
$this->loggerFactory = $logger_factory;notre constructeur peut simplement devenir :
public function __construct(
protected EntityTypeManagerInterface $entityTypeManager,
protected AccountProxyInterface $currentUser,
protected LoggerChannelFactoryInterface $loggerFactory,
) {}Les dépendances de la classe sont immédiatement identifiables et regroupées au même endroit.
Et readonly ?
Lorsque la dépendance n'a pas vocation à être remplacée après la construction de l'objet, on peut également utiliser readonly :
public function __construct(
protected readonly EntityTypeManagerInterface $entityTypeManager,
) {}Cela indique explicitement que cette propriété ne doit plus être réassignée par la suite.
Un petit changement qui améliore la lisibilité
La Constructor Property Promotion ne change pas le fonctionnement de l'injection de dépendances de Drupal. Il s'agit simplement d'une syntaxe PHP plus concise.
Elle permet cependant de supprimer une quantité non négligeable de code répétitif et de rendre les dépendances d'une classe beaucoup plus faciles à identifier.
Un petit réflexe à adopter sur vos prochains développements Drupal… et quelques lignes de code en moins à maintenir.