Рейтинг:2

Отсутствует пакет для узла типа сущности после обновления

флаг ph

Недавно я обновил локальную песочницу до ядра Drupal 9.2.4. Во время тестирования я получил ошибку при попытке добавить новое содержимое статьи из /node/add/article.

В журнале отображается следующее сообщение.

Drupal\Core\Entity\EntityStorageException: Отсутствует пакет для узла типа сущности в Drupal\Core\Entity\ContentEntityStorageBase->doCreate() (строка 97 из /var/www/drupal9sandbox/docroot/core/lib/Drupal/Core/Entity/ ContentEntityStorageBase.php).

Единственное изменение, которое я сделал до этого, — это изменение в файле article.routing.yml. я должен был использовать _entity_form: 'узел.по умолчанию' вместо Друпал\узел\Контроллер\УзелКонтроллер::добавить() поскольку это устарело в Drupal 9, как сообщается в Метод NodeController::add() устарел.

Это полное содержание статьи.routing.yml файл.

Помимо небольшого изменения в _entity_form: 'узел.по умолчанию', больше ничего не трогал.

custom_articles.add_content:
  путь: '/узел/добавить/статья'
  значения по умолчанию:
    _entity_form: 'узел.по умолчанию'
    _title_callback: '\Drupal\node\Controller\NodeController::addPageTitle'
    node_type: 'статья'
  требования:
    _node_add_access: 'узел: статья'
  параметры:
    _node_operation_route: ИСТИНА
    параметры:
      тип_узла:
        with_config_overrides: ИСТИНА

Я не уверен, где будет определен тип пакета, но этот тип контента хорошо работал в Drupal 8.9.16.

apaderno avatar
флаг us
В качестве примечания: если *Article* является типом контента, определенным на сайте, вам не нужно определять для него маршрут: модуль Node позаботится об этом. На самом деле, у него есть маршрут для */node/add/{node_type}*, который действителен для каждого типа контента на сайте.
флаг cn
Есть ли причина, по которой вы повторно объявляете существующий маршрут? Что произойдет, если вы удалите этот пользовательский маршрут и очистите кеш?
apaderno avatar
флаг us
Чтобы подтвердить комментарий @Clive, профиль установки *Standard*, используемый в Drupal 9 (но также и в предыдущих версиях Drupal), уже добавляет тип контента *Article*. Если Drupal установлен с использованием другого установочного профиля, *Article* не может быть предопределенным типом контента, но тем не менее нет необходимости добавлять пользовательский маршрут, когда об этом позаботится модуль Node.
флаг ph
@Clive, маршрут уже был там раньше. Единственное изменение, которое я сделал, было по умолчанию. Вместо `_entity_form: 'node.default'` использовался `controller:'Drupal\node\Controller\NodeController::add()'`. Однако это устарело в Drupal 9.
флаг cn
Если у вас нет действительно веской причины для создания пользовательского маршрута для пути, который уже существует и контролируется системой, вам следует удалить этот код. В противном случае вам придется продолжать поддерживать его вместе с обновлениями ядра без всякой пользы. Все, что вы могли бы сделать в повторно объявленном маршруте, вы можете сделать «правильно» с помощью другого метода.
флаг ph
@Clive, я только что удалил его, и это сработало! Согласно этому [списку изменений] (https://www.drupal.org/node/3084856) контроллер Add() был удален из Drupal 9 и теперь обрабатывается `_entity_form. В нем не указано, что использовать вместо этого, поэтому я предполагаю, что они имели в виду просто удалить контроллер Add(), если вы его используете.
флаг cn
Если это не то, что вы имели в виду, вы должны удалить всю декларацию маршрута IMO. Это не нужно и может вызвать у вас больше головной боли в будущем. Тот, кто написал это, вероятно, хорошо разбирался в API Symfony, но, возможно, в меньшей степени в API Drupal.
флаг ph
Это было построено на ранней стадии, когда мы мигрировали на Drupal. Поэтому я предполагаю, что они написали это на основе стандартного шаблона, доступного им ранее. Все последующие типы контента, которые были созданы, не имеют всего этого. поэтому решение состояло в том, чтобы удалить этот блок добавления в файле routing.yml. Как я могу принять ваш ответ?

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

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