Рейтинг:2

Может ли маршрутизация использовать параметры, уже указанные в URL-адресе?

флаг cn

На самом деле я использую 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'));
    вернуть $ури;
  }

Но, может быть, можно найти лучшее решение?

Jaypan avatar
флаг de
Вы не показали код, который вы используете для создания URL-адреса, вызывающего ошибку.
Jaypan avatar
флаг de
Я должен добавить, что я бы, вероятно, не стал возиться с путем к подэлементу, а скорее создал бы для него псевдоним для нужного вам пути.
флаг cn
Нет кода, это EntityListBuilder::getDefaultOperations, который автоматически создает ссылки, показанные в столбце «операции» списка. Поэтому я могу переопределить его или переопределить подметод, такой как Entity::toUrl или Entity::urlRouteParameters, как предложено @4k4. Я спросил себя, есть ли другой «волшебный способ», например, объявление определенного элемента в файле routing.yml, то есть: параметры: параметры: предмет: тип: сущность: {элемент} #
Рейтинг:2
флаг cn

I would override SubItem::urlRouteParameters() and make this independent from the current route match so that the entity can build links on all pages:

  protected function urlRouteParameters($rel) {
    $parameters = parent::urlRouteParameters($rel);
    // assuming the parent relationship is a reference field
    $parameters['item'] = $this->parent->target_id;
    // if the reference field is in the parent you have to run an entity query
    return $parameters;
  }
флаг cn
Хорошо. entity->toUrl() вызывает entity->urlRouteParameters() для получения параметров маршрута. Просто уровень выше. Но если нет другого способа, я могу переопределить один из этих двух методов. Спасибо за ваше предложение.
4uk4 avatar
флаг cn
ИМХО, этот защищенный метод существует только для переопределения в таких случаях использования.

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

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