How can I add cache context to custom menu link? 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

&lt;?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:

&lt;?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-&gt;uid = $current_user-&gt;id();
        $this-&gt;account = User::load($current_user-&gt;id());
    }

    public static function create(ContainerInterface $container, $base_plugin_id) {
        return new static(
            $container-&gt;get('current_user')
        );
    }

    public function getDerivativeDefinitions($base_plugin_definition) {
        $links = array();
        if (PersonaUtility::hasPersona($this-&gt;account, 'cliente_konsey')) {
           $links['contratos_cliente'] = [
                'title' =&gt; 'Contratos',
                'description' =&gt; 'Mis Contratos',
                'menu_name' =&gt; 'account',
                'weight' =&gt; 3,
                'route_name' =&gt; 'page_manager.page_view_mis_contratos_mis_contratos-panels_variant-0',
                'route_parameters' =&gt; ['user' =&gt; $this-&gt;uid]
            ] + $base_plugin_definition;

        $links['solicitudes_cliente'] = [
                'title' =&gt; 'Solicitudes',
                'description' =&gt; 'Mis solicitudes',
                'menu_name' =&gt; 'account',
                'weight' =&gt; 4,
                'route_name' =&gt; 'page_manager.page_view_mis_solicitudes_mis_solicitudes-panels_variant-0',
                'route_parameters' =&gt; ['user' =&gt; $this-&gt;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.
As @4k4 says you don't need the derivates class in this case you need to do something like this example:

.links.menu.yml file:

client_account_links:
  class: Drupal\my_module\Plugin\Menu\UserProfile
  menu_name: account
  title: 'Edit Your Profile'
  route_name:  entity.user.edit_form 


The class:

&lt;?php

namespace Drupal\my_module\Plugin\Menu;

use Drupal\Core\Menu\MenuLinkDefault;
use Drupal\Core\Menu\StaticMenuLinkOverridesInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;

/**
 * Represents a menu link for a user profile edition.
 */
class UserProfile extends MenuLinkDefault {

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;


  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, StaticMenuLinkOverridesInterface $static_override, AccountInterface $current_user) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $static_override);

    $this-&gt;currentUser = $current_user;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container-&gt;get('menu_link.static.overrides'),
      $container-&gt;get('current_user'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheContexts() {
    return ['user'];
  }

  /**
   * {@inheritdoc}
   */
  public function getRouteParameters() {
    // If the user is not Anonymous.
    if (!$this-&gt;currentUser-&gt;isAnonymous()) {
      // Getting the uid.
      $uid = $this-&gt;currentUser-&gt;id();
      // Adding the link.
      return ['user' =&gt; $uid];
    }
    return [];
  }

}