На самом деле я использую D9 для создания системы с сущностями, использующими подсущности.
Основная система объектов использует следующий путь: /item/{item}
Каждая подсущность связана с основной сущностью и использует этот путь: /item/{item}/sub_item/{sub_item}
Таким образом, для доступа к форме редактирования или удаления требуются следующие пути:
/item/{item}/sub_item/{sub_item}/edit
/item/{item}/sub_item/{sub_item}/удалить
Например: /item/1/sub_item/4/edit
Я объявил следующий маршрут:
entity.sub_item.edit_form:
путь: '/item/{item}/sub_item/{sub_item}/edit'
значения по умолчанию:
_entity_form: 'sub_item.edit'
_title: 'Редактировать подпункт'
параметры:
_admin_route: ИСТИНА
параметры:
предмет:
тип: сущность:элемент
with_config_overrides: ИСТИНА
под_элемент:
тип: сущность:sub_item
with_config_overrides: ИСТИНА
требования:
_permission: «администрирование конфигурации сайта»
Ссылки «Редактировать» и «Удалить» генерируются конструктором списков из getOperations. Построитель списка находится по следующему маршруту: /item/1/sub_items (это «коллекция» для отображения подэлементов, прикрепленных к основному элементу).
Я надеялся, что тот факт, что текущий URL содержит item/{item}, может быть напрямую повторно использован генератором ссылок, но это не факт...
Symfony\Component\Routing\Exception\MissingMandatoryParametersException : отсутствуют некоторые обязательные параметры ("item") для генерации URL-адреса для маршрута "entity.sub_item.edit_form".в Drupal\Core\Routing\UrlGenerator->doGenerate() (строка 181 файла /core/lib/Drupal/Core/Routing/UrlGenerator.php).
Я попытался создать определенный класс htmlRouteProvider для моего класса сущности подэлемента, но и в этом случае маршруты создаются при очистке кеша, и у меня нет доступа к элементу в URL-адресе, чтобы установить его...
Итак... Мой вопрос: мне не хватает чего-то, чтобы сделать это легко, или я должен повторно реализовать метод "toUrl()" моего класса сущности подэлемента, чтобы включить новый параметр "элемент" "на лету" "?
Заранее спасибо за любое предложение.
PS: это решение, которое у меня есть на самом деле в моем классе сущностей подэлемента:
публичная функция toUrl($rel = 'canonical', массив $options = []) {
$uri = parent::toUrl($rel, $options);
$uri->setRouteParameter('item', \Drupal::routeMatch()->getRawParameter('item'));
вернуть $ури;
}
Но, может быть, можно найти лучшее решение?