Рейтинг:1

MenuLink против MenuLinkContent — в чем смысл?

флаг in

Я изо всех сил пытаюсь выяснить связь между MenuLink и MenuLinkContent.

Я создаю новый пункт меню, например:

$menuItem = MenuLinkContent::create($params);

Я также могу запросить такие элементы, как:

$menuItems = \Drupal::entityTypeManager()->getStorage('menu_link_content')->loadByProperties(['link.uri' => "internal:$path"]);

И это хорошо работает. Теперь, если мне нужен один из этих объектов, я хочу получить его «братьев и сестер» — другой объект, который имеет одного и того же родителя. У меня есть какая-то странная структура:

$this->menuLinkManager = \Drupal::service('plugin.manager.menu.link');
$parentId = $menuItem->getParentId();
$parent = $this->menuLinkManager->createInstance($this->menuLinkManager->getDefinition($parentId)['id']);

И здесь я получаю его родителя, но это уже не объект MenuLinkContent, а экземпляр MenuLinkInterface. У него есть некоторые поля как MenuLinkContent, но не все. т.е. Я не знаю, как получить путь ссылки и тому подобное.

Там я могу пойти дальше:

$siblings = $this->menuLinkManager->getChildIds($parent->getPluginId());

Но главный вопрос чкак получить MenuLinkContent, когда у меня есть этот объект MenuLinkInterface?

Подвопрос - зачем нужна эта параллельная система меню и параллельные классы меню?

Jaypan avatar
флаг de
Интерфейсы — это не объекты, это определение требований класса, реализующего интерфейс. MenuLinkContent реализует MenuLinkInterface, вполне вероятно, что объект, с которым вы работаете, на самом деле является объектом MenuLinkContent.
4uk4 avatar
флаг cn
См. https://drupal.stackexchange.com/questions/259739/why-are-methods-for-going-from-the-menulinkcontent-menu-link-plugin-class-to-the
apaderno avatar
флаг us
Класс [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9.x) реализует [`MenuLinkInterface `](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21MenuLinkInterface.php/interface/MenuLinkInterface/8.9.x) и [`ContainerFactoryPluginInterface`](https:// api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Plugin%21ContainerFactoryPluginInterface.php/interface/ContainerFactoryPluginInterface/8.9.x).
apaderno avatar
флаг us
Учитывая, что второй интерфейс определяет только метод `create()`, нужен ли вам какой-либо метод, который не определен в интерфейсе `MenuLinkInterface`?
apaderno avatar
флаг us
(Кроме того, будьте осторожны, чтобы не перепутать [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Plugin%21Menu%21MenuLinkContent.php/class/MenuLinkContent/8.9 .x), который реализует плагин, с [`MenuLinkContent`](https://api.drupal.org/api/drupal/core%21modules%21menu_link_content%21src%21Entity%21MenuLinkContent.php/class/MenuLinkContent/ 8.9.x) класс, который является классом сущностей.)
4uk4 avatar
флаг cn
Это то же самое, что и блочные плагины и объекты block_content. В обоих случаях сохраненные объекты используются для создания плагинов.Тема, на которую я ссылаюсь, и следующая тема, связанная там, демонстрируют, как вы можете определить производный идентификатор плагина, который идентичен UUID объекта.
флаг in
Поэтому мне нужен способ работы с пунктами меню. Чтобы создать их, установите пути, веса, родителя, чтобы запросить их родителей и их детей. Это все. Я считаю, что MenuLinkContent - это класс сущностей, упомянутый @apaderno. Но когда я это меню LinkManager я получаю что-то еще.
Рейтинг:0
флаг cn
$siblings = $this->menuLinkManager->getChildIds($parent->getPluginId());

Но главный вопрос заключается в том, как получить MenuLinkContent, когда у меня есть этот объект MenuLinkInterface?

Существует два типа идентификаторов плагинов. Без или с двоеточием :.

Не производные плагины

Без них они указывают прямо на одно определение плагина.

Например меню администратора

\Drupal::service('plugin.manager.menu.link')->getChildIds('system.admin');

состоит в основном из не производных ссылок меню, идентификаторы которых вы найдете в файлах *.links.menu.yml.

Производные плагины

С двоеточием первая часть — это базовый идентификатор плагина, а вторая часть — производный идентификатор.

Например, если вы создали многоуровневое главное меню из пользовательского интерфейса и примените эту команду к родительскому меню.

\Drupal::service('plugin.manager.menu.link')->getChildIds('standard.front_page');

Вы получаете такие ссылки

menu_link_content:421a421a-cb1d-33e7-a810-1e7341f7906b

для базового плагина MenuLinkContent (кстати, также определенного в YAML-файл) с производным для сущностей MenuLinkContent (идентифицируемых UUID).

$entity = \Drupal::service('entity.repository')
  ->loadEntityByUuid('menu_link_content', '421a421a-cb1d-33e7-a810-1e7341f7906b');

Если у вас уже есть экземпляр плагина, вы можете получить UUID из объекта плагина. Видеть https://drupal.stackexchange.com/a/235769/47547

флаг in
Спасибо. Я понял это после перехода по ссылке из вашего комментария, но определенно хорошо иметь полный ответ. ИМХО, это излишне сложно: для некоторых запросов мне нужен менеджер ссылок меню, для других репозиторий сущностей. Иногда идентификатор — это просто число, например идентификатор узла, иногда это content_type:uuid. Иногда вы можете получить доступ ко всем свойствам, иногда нет. Опять же, ИМХО, наличие единого репозитория, единого формата идентификатора, одного класса и всегда доступных полей сделало бы жизнь намного проще. И что еще хуже, трудно найти подходящую документацию/пример. Простите мою наивную точку зрения.

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

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