Рейтинг:0

Контроллер на маршруте /taxonomy/term/{taxonomy_term}

флаг lc

У меня есть обычный контроллер на странице терминов таксономии (исходное представление отключено). Он отлично работает, чтобы показать то, что я хочу показать, однако ни то, ни другое получить название ни его доступ когда-либо вызывается (второе, конечно, более раздражающее). Проблема не в моем контроллере, потому что использование другого маршрута работает нормально:

пример.content.documents_list:
  путь: '/taxonomy/term/{taxonomy_term}'
  значения по умолчанию:
    _controller: '\Drupal\example\Controller\DocumentListController::content'
    _title_callback: '\Drupal\example\Controller\DocumentListController::getTitle'
  требования:
    _custom_access: '\Drupal\example\Controller\DocumentListController::access'

пример.content.documents_list2:
  путь: '/xxx/{taxonomy_term}'
  значения по умолчанию:
    _controller: '\Drupal\example\Controller\DocumentListController::content'
    _title_callback: '\Drupal\example\Controller\DocumentListController::getTitle'
  требования:
    _custom_access: '\Drupal\example\Controller\DocumentListController::access'

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

Kevin avatar
флаг in
Предположительно, ваш пользовательский доступ не помечен должным образом. Почему бы не использовать TVI?
флаг lc
И он все еще вызывается, когда путь отличается? Потому что мои потребности кардинально отличаются. Мой контроллер решает, что показывать, в зависимости от многих факторов, встраивая различные блоки или создавая таблицы в зависимости от ситуации.Это не разрешимо с представлениями так, как я хочу, чтобы они были решены. Я программист, поэтому у меня нет проблем с созданием контента с помощью моего собственного кода вместо представлений (не поймите меня неправильно, я ничего не имею против представлений, и у меня есть несколько на этом сайте, просто есть места, где представление не лучшее решение).
4uk4 avatar
флаг cn
Представление — это переопределение уже существующего маршрута основного объекта, который повторно включается при отключении представления. См. https://drupal.stackexchange.com/questions/241880/override-specific-routing-from-a-core-module.
флаг lc
Это было вероятное решение, на которое я намекал, но тем временем я попробовал другой подход, и он потерпел неудачу. Разве EnhancerInterface здесь не применим? Я могу изменить входящий $defaults['_title_callback'] на что-то другое, но это не имеет никакого значения. (У меня уже есть энхансер для другого маршрута, поэтому было проще просто попробовать добавить туда еще одно условие).
флаг lc
О, боже мой, у меня уже был подписчик, я забыл, когда добавлял его, просто он установил только _controller, а не другие ... :-) Я скопирую его в ответ на вечность. Спасибо за правильный указатель.
Рейтинг:1
флаг lc

Отчасти это была моя ошибка, у меня был МаршрутПодписчик уже на месте, но еще не полностью задействован, как указано в комментарии 4k4. Окончательное решение: да, его нужно переопределить, потому что это системный маршрут:

класс RouteSubscriber расширяет RouteSubscriberBase {

  защищенная функция alterRoutes(RouteCollection $ collection) {
    если ($ route = $ collection-> get ('entity.taxonomy_term.canonical')) {
      $route->setDefault('_controller', 'Drupal\example\Controller\DocumentListController::content');
      $route->setDefault('_title_callback', 'Drupal\example\Controller\DocumentListController::getTitle');
      $route->setRequirement('_custom_access', 'Drupal\example\Controller\DocumentListController::access');
    }
  }

}
sonfd avatar
флаг in
Чтобы уточнить, вы используете подписчика маршрута для изменения существующих маршрутов **вместо** определения ваших маршрутов через my_module.routing.yml?
флаг lc
У меня есть оба. Пояс и подтяжки, знаете ли. :-) Но теперь вы меня полюбопытствовали, я проверяю, достаточно ли одного подписчика. Ответ: достаточно одного абонента. .yml сам по себе не является.
Kevin avatar
флаг in
Ямл определяет это, альтер модифицирует существующее - вот почему. Этот маршрут уже существует.
apaderno avatar
флаг us
Подписчики маршрута используются для изменения маршрута, определенного из другого модуля; они эквивалентны `hook_menu_alter()` в Drupal 7. Файлы .routing.yml эквивалентны `hook_menu()` в Drupal 7. Как и в Drupal 7, вы не используете оба для одного и того же маршрута.
флаг lc
Тогда один небольшой вопрос или замечание: если я пропущу то же самое из .routing.yml, я потеряю удобство моего другого имени маршрута, и мне придется использовать исходное имя во всем моем коде. Указание его и там, и в подписчике, кажется, предлагает лучшее из обоих миров, даже если это избыточно: я могу использовать свое собственное имя маршрута, и оно все равно будет переопределено.
4uk4 avatar
флаг cn
Вы можете удалить основной маршрут в подписчике маршрута `$ collection->remove('entity.taxonomy_term.canonical');`, чтобы у вас не было двух маршрутов для одного и того же пути после того, как вы добавили свой собственный маршрут в * .routing.yml. Предостережение: это может нарушить зависимости, например, в ссылках меню.
4uk4 avatar
флаг cn
Нет проблем с двумя маршрутами для одного и того же пути, но это имеет смысл только в том случае, если они различаются при сопоставлении маршрута, например, при наличии разных протоколов. В противном случае совпадение маршрута приводит к случайному поведению. Имея тот же контроллер, вы не заметите случайного поведения сейчас, но это может быть сложно отладить позже, когда вы измените один из маршрутов.
4uk4 avatar
флаг cn
Поэтому, вероятно, лучше всего использовать исходный маршрут во всем коде.

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

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