Size: a a a

2020 September 07

VV

Vadim Valuev in Drupal RU
Вот что пишут в комментарии:
 This is to be used in procedural code such as module files to instantiate
  * an object of a class that implements
  * \Drupal\Core\DependencyInjection\ContainerInjectionInterface.
  *
  * One common usecase is to provide a class which contains the actual code
  * of a hook implementation, without having to create a service
источник

VV

Vadim Valuev in Drupal RU
А почему бы не создать сервис?
источник

VV

Vadim Valuev in Drupal RU
ага, я, кажется, понял. Если эта штука используется только и исключительно в процедурном коде, то тогда classResolver. Хотя интересно было бы понять, какие у него преимущества перед сервисом. Не засоряет сервис контейнер?
источник
2020 September 08

C

Comrade Gagarin in Drupal RU
сервис называется class_resolver
источник

VV

Vadim Valuev in Drupal RU
Comrade Gagarin
сервис называется class_resolver
Эм, с тобой не поспоришь. Сервис инициализирует классы, которые тоже могли бы быть сервисами, но никогда ими не будут.
источник

C

Comrade Gagarin in Drupal RU
Вопрос в чём?
источник

C

Comrade Gagarin in Drupal RU
"А почему бы не создать сервис?" сервис уже создан и называется class_resolver
источник

VV

Vadim Valuev in Drupal RU
Comrade Gagarin
Вопрос в чём?
Не обязательно отвечать на вопрос, если не очень понимаешь, о чём речь. Если интересно - найди коммент, найди примеры использования, посмотри, прочитай ещё раз.
источник

C

Comrade Gagarin in Drupal RU
Какой сервис ты хочешь создать?
источник

C

Comrade Gagarin in Drupal RU
Не обязательно задавать вопрос, если не можешь его сформулировать
источник

VV

Vadim Valuev in Drupal RU
не то что бы я хочу создать, меня интересует подоплёка решения
источник

VV

Vadim Valuev in Drupal RU
например
function field_layout_entity_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
 if ($display instanceof EntityDisplayWithLayoutInterface) {
   \Drupal::classResolver(FieldLayoutBuilder::class)->buildView($build, $display);
 }
}
источник

VV

Vadim Valuev in Drupal RU
не \Drupal::service('field_layout_builder')
источник

VV

Vadim Valuev in Drupal RU
а  Drupal::classResolver(FieldLayoutBuilder::class)
источник

C

Comrade Gagarin in Drupal RU
Т.е. вопрос был - почему все классы в друпале не сервисы?
источник

C

Comrade Gagarin in Drupal RU
Экземпляр сервиса в основном создаётся единожды (читай синглтон), поэтому нет смысла например в сервисе \Drupal\Core\Template\Attribute
источник

VV

Vadim Valuev in Drupal RU
именно поэтому Attribute инициализируется new Attribute, и никакого  classResolvera там нет
источник

VV

Vadim Valuev in Drupal RU
хотя забавная штука, он, похоже, может и атрибуты херачить, и сервисы доставать, но основной прикол
 if (is_subclass_of($definition, 'Drupal\Core\DependencyInjection\ContainerInjectionInterface')) {
       $instance = $definition::create($this->container);
     }
источник

AP

Andrey Postnikov in Drupal RU
Идея лишь в том, чтобы оставить лишь одну прокладку в процедурном коде
Уже довольно давно в топе профайлером вижу \Drupal::
источник

AP

Andrey Postnikov in Drupal RU
Vadim Valuev
хотя забавная штука, он, похоже, может и атрибуты херачить, и сервисы доставать, но основной прикол
 if (is_subclass_of($definition, 'Drupal\Core\DependencyInjection\ContainerInjectionInterface')) {
       $instance = $definition::create($this->container);
     }
Именно потому, что хуки иногда из перестроенного контейнера нужно вызывать
источник