Рейтинг:1

Метод getTitle() возвращает неожиданное значение. Что вызывает это?

флаг kz

В реализации крюк_узел_вставка (), у меня есть следующие три строки кода:

dpm($entity, 'объект');
$title = $entity->getTitle();
дпм($заголовок, 'заголовок');

С самого начала дпм() Я получил:

сущность =>
Drupal\узел\сущность\узел {# 1632 ★ ¼
  +in_preview: ноль
  #значения:массив:27 [❗¼
    ...
    "название" => массив: 1 [◄¼
       "x-default" => массив: 1 [○¼
        0 => массив: 1 [≥
          "значение" => "Ожидаемый заголовок"
        ]
     ]
...

т.е. поле заголовка, выводимое дампером переменных, — это поле заголовка, которое я ожидал увидеть.

Второй дпм() производит:

название =>
«Предыдущее название»

т.е. когда я извлекаю заголовок из объекта, используя получитьзаголовок() метод, я получаю разные стоимость. Значение получено от объекта (узла), который я загружаю в контроллер связи операций (переопределение База Контроллеров), но он не сохраняется внутри контроллера и не должен срабатывать крюк_узел_вставка ().

Я создаю и сохраняю новый узел в контроллере, используя этот код:

$node = \Drupal::entityTypeManager()->getStorage('узел')->create([
  'тип' => 'мой_тип',
  'тело' => 'тело',
]);
$node->setTitle('Ожидаемый заголовок');
$узел->сохранить();

Я предполагаю, что это $узел->сохранить();который стреляет крюк_узел_вставка.

Что здесь происходит?

Почему в хуке появляется фальшивый заголовок и как мне получить ожидаемый результат?

Для записи: я не меняю узел в крюк_узел_вставка. Я удаляю его, если заголовок соответствует определенным критериям. Я не могу использовать ограничение для предотвращения его создания по причинам, не связанным с этим вопросом.

4uk4 avatar
флаг cn
Следовать этому нелегко по нескольким причинам. Массив защищенных значений в объекте контента не должен считываться пользовательским кодом. Он всегда содержит исходные значения, x-default является константой для языка по умолчанию. Так что это нормально, что getTitle() возвращает другой результат. dpm() не является средством отладки в реальном времени. Он помещает вывод в сеанс, который иногда отображается на один или два запроса позже, в зависимости от того, когда в следующий раз отображается блок сообщений. Попробуйте Xdebug. Кроме того, hook_node_insert() слишком поздно для изменения узла, используйте хук для предварительного сохранения.
Free Radical avatar
флаг kz
@ 4uk4 Я думал, что методы, предоставляемые классом для получения защищенных значений, должны были возвращать фактическое значение поля. Я удивлен, узнав, что это не всегда так. Спасибо, что подтолкнули меня в сторону Xdebug
Рейтинг:1
флаг cn

В объекте контента защищенный $значения Массив содержит исходные значения объекта. Фактические значения полей хранятся в защищенном массиве $поля, который содержит массив объектов FieldItemList. Они создаются лениво, поэтому при загрузке узла этот массив пуст. Когда вы получаете/устанавливаете поля с помощью методов и свойств общедоступных объектов, объекты полей с фактическими данными будут созданы и сохранены в этом внутреннем массиве.

В целях отладки вы можете принудительно $поля массив, который будет полностью заполнен

$values ​​= $node->toArray();

Это возвращает значения сущности путем создания всех объектов поля и построения массива фактических значений поля.

Для проверки свойств объекта не используйте dpm(), потому что вы не знаете, является ли отображаемый результат тем же запросом.

leymannx avatar
флаг ne
Добавил бы информацию о хуке и Xdebug. Ваш комментарий - золото.
Free Radical avatar
флаг kz
Спасибо за очень поучительный ответ о том, как использование методов открытых сущностей для доступа к защищенным полям работает за кулисами.

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

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