Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 66 additions & 21 deletions src/Plugin/GraphQL/DataProducer/Menu/MenuLink/MenuLinkUrl.php
Original file line number Diff line number Diff line change
@@ -1,40 +1,85 @@
<?php

declare(strict_types=1);

namespace Drupal\graphql\Plugin\GraphQL\DataProducer\Menu\MenuLink;

use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Menu\MenuLinkInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Url;
use Drupal\graphql\Attribute\DataProducer;
use Drupal\graphql\GraphQL\Execution\FieldContext;
use Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
* Returns the URL object of a menu link.
*
* @todo Fix input and output context type.
*
* @DataProducer(
* id = "menu_link_url",
* name = @Translation("Menu link url"),
* description = @Translation("Returns the URL of a menu link."),
* produces = @ContextDefinition("any",
* label = @Translation("URL")
* ),
* consumes = {
* "link" = @ContextDefinition("any",
* label = @Translation("Menu link")
* )
* }
* )
*/
class MenuLinkUrl extends DataProducerPluginBase {
#[DataProducer(
id: 'menu_link_url',
name: new TranslatableMarkup('Menu link url'),
description: new TranslatableMarkup('Returns the URL of a menu link.'),
produces: new ContextDefinition(
data_type: 'any',
label: new TranslatableMarkup('URL'),
),
consumes: [
'link' => new ContextDefinition(
data_type: 'any',
label: new TranslatableMarkup('Menu link'),
),
],
)]
class MenuLinkUrl extends DataProducerPluginBase implements ContainerFactoryPluginInterface {
use DependencySerializationTrait;

/**
* Resolver.
*
* @param \Drupal\Core\Menu\MenuLinkInterface $link
* The language manager service.
*/
protected LanguageManagerInterface $languageManager;

/**
* {@inheritdoc}
*
* @return \Drupal\Core\Url
* @codeCoverageIgnore
*/
public static function create(ContainerInterface $container, array $configuration, $pluginId, $pluginDefinition) {
return new static(
$configuration,
$pluginId,
$pluginDefinition,
$container->get('language_manager')
);
}

/**
* MenuLinkUrl constructor.
*/
public function resolve(MenuLinkInterface $link) {
return $link->getUrlObject();
public function __construct(array $configuration, string $pluginId, array $pluginDefinition, LanguageManagerInterface $languageManager) {
parent::__construct($configuration, $pluginId, $pluginDefinition);
$this->languageManager = $languageManager;
}

/**
* Resolver.
*/
public function resolve(MenuLinkInterface $link, FieldContext $context): Url {
$url = $link->getUrlObject();

if ($langcode = $context->getContextLanguage()) {
if ($language = $this->languageManager->getLanguage($langcode)) {
$url->setOption('language', $language);
}
$context->addCacheContexts(['languages:language_url']);
}

return $url;
}

}
Loading