DependencySerializationTrait
este folosit pentru a evita ca un serviciu conținut într-o proprietate de clasă să fie complet serializat atunci când acea instanță de clasă este serializată. În schimb, identificatorul de serviciu este serializat în instanța clasei.
DependencySerializationTrait
nu este folosit pentru a adăuga dependențe la o clasă care utilizează Dependency Injection. Dacă editați o clasă existentă de gestionare a controlului accesului (ceea ce nu este lucrul corect de făcut atunci când clasa este implementată de nucleul Drupal sau de un modul contribuit găzduit pe drupal.org) pentru a adăuga mai multe dependențe, ar trebui să-i editați createInstance()
metoda, dacă există, sau adăugați-o. De exemplu, cel WorkflowAccessControlHandler
clasa folosește următorul cod, pentru a injecta dependențele de care are nevoie.
/**
* {@inheritdoc}
*/
funcția publică statică createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
returnează static nou ($entity_type, $container
->get('plugin.manager.workflows.type'));
}
/**
* Construiește instanța de gestionare a controlului accesului fluxului de lucru.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* Definiția tipului de entitate.
* @param \Drupal\Component\Plugin\PluginManagerInterface $workflow_type_manager
* Managerul de plugin de tip flux de lucru.
*/
funcția publică __construct(EntityTypeInterface $entity_type, PluginManagerInterface $workflow_type_manager) {
parent::__construct($entity_type);
$this->workflowTypeManager = $workflow_type_manager;
}
Modul corect de a modifica un handler de control al accesului utilizat de o entitate este implementarea hook_entity_type_build()
și schimbați handlerul de control al accesului cu EntityTypeInterface::setAccessClass()
. De exemplu, pentru entitatea Node, aș putea folosi următorul cod.
funcția book_entity_type_build(array &$entity_types) {
/** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
$entity_types['node']->setAccessClass('Drupal\mymodule\Access\ExtendedNodeAccessControlHandler');
}