I have two routes that receive user as route parameter, and i need a menu link for every one in account menu. So I added in my *links.menu.yml
client_account_links:
deriver: \Drupal\my_module\Plugin\Menu\CustomLinks\ClientMenuLinksDerivative
class: \Drupal\my_module\Plugin\Menu\CustomMenuLink
And I created my CustomMenuLink class in my_module/src/Plugin/Menu with
<?php
namespace Drupal\my_module\Plugin\Menu;
use Drupal\Core\Menu\MenuLinkDefault;
/**
* A menu link that cache by user context.
*/
class CustomMenuLink extends MenuLinkDefault {
public function getCacheMaxAge() {
return 0;
}
public function getCacheContexts() {
return ['user'];
}
}
And my ClientMenuLinksDerivative has:
<?php
namespace Drupal\my_module\Plugin\Menu\CustomLinks;
use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Session\AccountProxy;
use Drupal\user\Entity\User;
use Drupal\personas\PersonaUtility;
class ClientMenuLinksDerivative extends DeriverBase implements ContainerDeriverInterface {
protected $account;
protected $uid;
public function __construct(AccountProxy $current_user) {
$this->uid = $current_user->id();
$this->account = User::load($current_user->id());
}
public static function create(ContainerInterface $container, $base_plugin_id) {
return new static(
$container->get('current_user')
);
}
public function getDerivativeDefinitions($base_plugin_definition) {
$links = array();
if (PersonaUtility::hasPersona($this->account, 'cliente_konsey')) {
$links['contratos_cliente'] = [
'title' => 'Contratos',
'description' => 'Mis Contratos',
'menu_name' => 'account',
'weight' => 3,
'route_name' => 'page_manager.page_view_mis_contratos_mis_contratos-panels_variant-0',
'route_parameters' => ['user' => $this->uid]
] + $base_plugin_definition;
$links['solicitudes_cliente'] = [
'title' => 'Solicitudes',
'description' => 'Mis solicitudes',
'menu_name' => 'account',
'weight' => 4,
'route_name' => 'page_manager.page_view_mis_solicitudes_mis_solicitudes-panels_variant-0',
'route_parameters' => ['user' => $this->uid]
] + $base_plugin_definition;
}
return $links;
}
}
This create my menu links in the account menu but the route parameter always is the same, so if I change user, the links send me to another user page, the user that run the code before that cached.
My question is how I can create custom menu links, with route parameters (user in my case), and the links change by user? because this don't work. Also I tried with hook_menu_links_discovered_alter(), but without lucky.