Доступные ссылки на действия /кеширование

У меня есть некоторые ссылки действий, определенные в module.links.actions.yml, который использует настраиваемый маршрут создания сущности. Для создания сущности я установил некоторые ограничения, и в какой-то момент доступ запрещен. Проблема в том, что, пока доступ к странице запрещен, ссылка действия все еще отображается до тех пор, пока я не удалю все кеши.

Есть ли способ сообщить Drupal не кэшировать ссылки или программно очистить кеш ссылок? Или некоторые параметры, которые я могу добавить в файл yml, чтобы предотвратить кеширование?

Спасибо.

8
5 голосов | спросил Marius Ilie 13 +03002016-10-13T09:58:05+03:00312016bEurope/MoscowThu, 13 Oct 2016 09:58:05 +0300 2016, 09:58:05

1 ответ


0

В следующем примере реализована ссылка на действие в Drupal 8 с требованием кэширования, специфичного для пользователя. Это должно позволить вам скрыть /отобразить ссылку действия для разных пользователей на вашей странице. Также следует работать с различными названиями для разных пользователей.

mymodule.links.action.yml:

entity.mymodule.add_form:
  class: Drupal\mymodule\Plugin\Menu\LocalAction\UserAction
  route_name: entity.mymodule.add_form
  title: 'Link to Add Form'
  appears_on:
    - entity.mymodule.collection

mymodule/src/Plugin/Menu/LocalAction/UserAction.php:

<?php

namespace Drupal\randomintro\Plugin\Menu\LocalAction;

use Drupal\Core\Menu\LocalActionDefault;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\Core\Routing\RouteMatchInterface;

/**
 * Defines a test local action plugin class.
 */
class UserAction extends LocalActionDefault {

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


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

    $this->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->get('router.route_provider'),
      $container->get('current_user')
    );
  }

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

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

}
ответил PhilippVerpoort 18 J0000006Europe/Moscow 2018, 01:13:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132