Я создал два пользовательских объекта, entity_one и entity_two. entity_one имеет поле ссылки на сущность, которое позволяет вам выбирать неограниченное количество экземпляров entity_twos. Форма редактирования для entity_one работает нормально. Поле существует и правильно автоматически заполняется entity_twos. Однако, как только я отправляю и создаю entity_one, страница списка для entity_ones выдает мне ошибку.
Ошибка: вызов функции-члена getValue() для строки в
Drupal\Core\Entity\ContentEntityBase->__sleep() (строка 524
core/lib/Drupal/Core/Entity/ContentEntityBase.php).
Если я удаляю это конкретное поле и использую только текстовые поля, я не сталкиваюсь с таким поведением. Это происходит только тогда, когда у меня есть поле ссылки на сущность.
Мой первый инстинкт был, возможно, в моем EntityOneListBuilder.php, он использует поле в таблице, которое не отформатировано должным образом, но используются только поля ID и title.
Вот часть моего EntityOneListBuilder
общедоступная статическая функция createInstance (ContainerInterface $container, EntityTypeInterface $entity_type) {
вернуть новую статику(
$entity_type,
$container->get('entity_type.manager')->getStorage($entity_type->id()),
$контейнер->получить('url_generator')
);
}
публичная функция рендеринга () {
$сборка['описание'] = [
'#markup' => $this->t('Текст описания'),
];
$build['table'] = parent::render();
вернуть $сборку;
}
общедоступная функция buildHeader() {
$header['id'] = $this->t('ID');
$header['title'] = $this->t('Title');
вернуть $header + parent::buildHeader();
}
общедоступная функция buildRow (EntityInterface $entity) {
$row['id'] = $entity->id();
$row['title'] = $entity->toLink()->toString();
вернуть $row + parent::buildRow($entity);
}
А вот как я создаю поле ссылки на сущность для entity_one
$fields['entity_twos'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Поля формы'))
->setDescription(t('Поля для добавления в эту форму.'))
->setRevisionable(ИСТИНА)
->setSetting('target_type', 'entity_two')
->setTargetEntityTypeId('entity_two')
->setSetting('обработчик','по умолчанию')
->setDisplayOptions('вид', [
'метка' => 'скрыто',
'тип' => 'entity_two',
'вес' => 0,
])
->setDisplayOptions('форма', [
'тип' => 'entity_reference_autocomplete',
'вес' => 5,
'настройки' => [
'autocomplete_type' => 'теги',
'размер' => '60',
'match_operator' => 'СОДЕРЖИТ',
'заполнитель' => '',
],
])
->setDisplayConfigurable('форма', правда)
->setDisplayConfigurable('вид', правда)
-> setRequired (ИСТИНА)
->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
Почему именно это поле сломает мою страницу коллекции?
Обновить: Я понимаю, что код в entity_two может быть тем, что его ломает. Вот некоторые из кода здесь для справки
общедоступная статическая функция baseFieldDefinitions(
EntityTypeInterface $entity_type
) {
$fields['id'] = BaseFieldDefinition::create('integer')
->setLabel(t('ID'))
-> установить только для чтения (истина);
$fields['uuid'] = BaseFieldDefinition::create('uuid')
->setLabel(t('UUID'))
-> установить только для чтения (истина);
$fields['title'] = BaseFieldDefinition::create('string')
->setLabel(t('Заголовок'))
-> установить настройки ([
'max_length' => 255,
'текстовая_обработка' => 0,
])
->setDefaultValue (ноль)
->setDisplayOptions('вид', [
'метка' => 'выше',
'тип' => 'строка',
'вес' => -6,
])
->setDisplayOptions('форма', [
'тип' => 'строковое_текстовое поле',
'вес' => -6,
])
->setDisplayConfigurable('форма', правда)
->setDisplayConfigurable('вид', правда);
$fields['field_type'] = BaseFieldDefinition::create('list_string')
->setLabel(t('Тип поля'))
->setDisplayOptions('вид', [
'метка' => 'видимый',
'тип' => 'список_по умолчанию',
])
-> установить настройки ([
'разрешенные_значения' => [
'флажок' => 'Флажок',
'text_field' => 'Текстовое поле',
],
])
->setDisplayOptions('форма', [
'тип' => 'options_select',
]);
$fields['allowed_values'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Разрешенные значения'))
->setDisplayOptions('вид', [
'метка' => 'видимый',
'тип' => 'базовая_строка',
'вес' => 6,
])
->setDisplayOptions('форма', [
'тип' => 'string_textarea',
'ряды' => 6,
'вес' => 6,
'настройки' => ['строки' => 4],
])
->setDisplayConfigurable('форма', правда)
->setDisplayConfigurable('вид', правда);
$fields['код языка'] = BaseFieldDefinition::create('язык')
->setLabel(t('Код языка'))
-> установитьОписание(
t('Код языка сущности ContentEntityExample.')
);
$fields['создано'] = BaseFieldDefinition::create('создано')
->setLabel(t('Создано'))
->setDescription(t('Время создания сущности.'));
$fields['изменено'] = BaseFieldDefinition::create('изменено')
->setLabel(t('Изменено'))
->setDescription(t('Время последнего редактирования сущности.'));
вернуть $поля;
}
}
Обновление 2: Я могу подтвердить, что ошибка возникает, когда он пытается использовать getValue() для идентификатора объекта, на который ссылается. В ContentEntityBase.php здесь происходит сбой:
общественная функция __sleep() {
// Получить значения созданных объектов полей, только сериализовать значения.
foreach ($this->fields as $name => $fields) {
foreach ($fields как $langcode => $field) {
$this->values[$name][$langcode] = $field->getValue();
}
}
Когда значение $field представляет собой простую строку, содержащую идентификатор объекта, на который делается ссылка.