Рейтинг:4

non-existent service, yet cache is cleared and module is enabled

флаг ca

I'm trying to access a Drupal service for normalizing content, yet the service is non-existent, even though the module "hal" is enabled and the service is defined. How can I get the service "serializer.normalizer.entity.hal"?

root@0968b6d03cdb:/var/www/html# drush cr
 [success] Cache rebuild complete.

root@0968b6d03cdb:/var/www/html# drush pml|grep hal
  Web services                      HAL (hal)                                               Enabled    9.3.0           

root@0968b6d03cdb:/var/www/html# drush ev "\Drupal::service('serializer.normalizer.entity.hal');"

In Container.php line 156:
                                                                                 
  You have requested a non-existent service "serializer.normalizer.entity.hal".  
                                                                                 
root@0968b6d03cdb:/var/www/html# cat core/modules/hal/hal.services.yml
services:
  serializer.normalizer.entity_reference_item.hal:
    class: Drupal\hal\Normalizer\EntityReferenceItemNormalizer
    arguments: ['@hal.link_manager', '@serializer.entity_resolver', '@entity_type.manager']
    tags:
      - { name: normalizer, priority: 10 }
  serializer.normalizer.field_item.hal:
    class: Drupal\hal\Normalizer\FieldItemNormalizer
    tags:
      - { name: normalizer, priority: 10 }
  serializer.normalizer.field.hal:
    class: Drupal\hal\Normalizer\FieldNormalizer
    tags:
      - { name: normalizer, priority: 10 }
  serializer.normalizer.file_entity.hal:
    class: Drupal\hal\Normalizer\FileEntityNormalizer
    arguments: ['@entity_type.manager', '@hal.link_manager', '@module_handler', '@config.factory', '@entity_type.repository', '@entity_field.manager']
    tags:
      - { name: normalizer, priority: 20 }
  serializer.normalizer.timestamp_item.hal:
   class: Drupal\hal\Normalizer\TimestampItemNormalizer
   tags:
     # Priority must be higher than serializer.normalizer.field_item.hal.
     - { name: normalizer, priority: 20 }
  serializer.normalizer.entity.hal:
    class: Drupal\hal\Normalizer\ContentEntityNormalizer
    arguments: ['@hal.link_manager', '@entity_type.manager', '@module_handler', '@entity_type.repository', '@entity_field.manager']
    tags:
      - { name: normalizer, priority: 10 }
  serializer.encoder.hal:
    class: Drupal\hal\Encoder\JsonEncoder
    tags:
      - { name: encoder, priority: 10, format: hal_json }

  # Link managers.
  hal.link_manager:
    class: Drupal\hal\LinkManager\LinkManager
    arguments: ['@hal.link_manager.type', '@hal.link_manager.relation']
  hal.link_manager.type:
    class: Drupal\hal\LinkManager\TypeLinkManager
    arguments: ['@cache.default', '@module_handler', '@config.factory', '@request_stack', '@entity_type.bundle.info', '@entity_type.manager']
  hal.link_manager.relation:
    class: Drupal\hal\LinkManager\RelationLinkManager
    arguments: ['@cache.default', '@entity_type.manager', '@module_handler', '@config.factory', '@request_stack', '@entity_type.bundle.info', '@entity_field.manager']

I can get other services, just not the "hal" one I want. For example, drush ev '\Drupal::service("node.node_route_context");' works fine.

Рейтинг:6
флаг bd

Вы не можете получить его напрямую, потому что сервисы нормализаторов являются закрытыми, начиная с Drupal 8.6, см. https://www.drupal.org/node/2936397:

Непосредственное использование служб кодировщика/нормализатора не поддерживается, необходимо использовать службу @serializer, которая затем вызовет соответствующие службы кодировщика/нормализатора. Службы, имеющие тег normalizer или encoder, на самом деле являются внутренними/частными деталями реализации, кульминацией которых является работающая служба @serializer. Они никогда не были API. Они реализуют API Symfony "Serializer component".

По этой же причине услуга не указана при просмотре всех доступных услуг:

/var/www/html# drupal debug:container | grep 'хал'
hal.link_manager Drupal\hal\LinkManager\LinkManager                                        
hal.link_manager.relation Drupal\hal\LinkManager\RelationLinkManager                                
hal.link_manager.type Drupal\hal\LinkManager\TypeLinkManager  

Как видите, ни один из сервисов из ядро/модули/hal/hal.services.yml, которые помечены как нормализатор перечислены.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.