Drupal 8 - 如何为特定节点类型添加任务和上下文链接?

Mac*_*Sim 6 drupal

我为 base_route 创建了一个任务链接和一个上下文链接:entity.node.canonical

mymodule.routing.yml

mymodule.mycustomroute:
  path: '/node/{node}/custom-path'
  defaults:
    _form: '\Drupal\mymodule\Form\MyForm'
  requirements:
    _permission: 'my permission'
    node: '[0-9]+'
Run Code Online (Sandbox Code Playgroud)

mymodule.links.tasks.yml

mymodule.mycustomroute:
  route_name: mymodule.mycustomroute
  base_route: entity.node.canonical
  title: 'my title'
Run Code Online (Sandbox Code Playgroud)

mymodule.links.contextual.yml

mymodule.mycustomroute:
  route_name: mymodule.mycustomroute
  group: node
Run Code Online (Sandbox Code Playgroud)

我的链接显示在我想要的每个节点上的查看/编辑/删除链接旁边。

现在我想知道如何才能使这些链接仅适用于特定节点类型?

Mac*_*Sim 7

mymodule/mymodule.routing.yml

mymodule.mycustomroute:
  path: '/node/{node}/custom-path'
  defaults:
    _form: '\Drupal\mymodule\Form\MyForm'
  requirements:
    _permission: 'my permission'
    _custom_access: '\Drupal\mymodule\Access\NodeTypeAccessCheck::access'
    _node_types: 'node_type_1,node_type_2,node_type_n'
    node: '\d+'
Run Code Online (Sandbox Code Playgroud)

mymodule/src/Access/NodeTypeAccessCheck.php

namespace Drupal\mymodule\Access;

use Drupal\Core\Access\AccessCheckInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\node\NodeInterface;
use Symfony\Component\Routing\Route;

/**
 * Check the access to a node task based on the node type.
 */
class NodeTypeAccessCheck implements AccessCheckInterface {

  /**
   * {@inheritdoc}
   */
  public function applies(Route $route) {
    return NULL;
  }

  /**
   * A custom access check.
   *
   * @param \Drupal\node\NodeInterface $node
   *   Run access checks for this node.
   */
  public function access(Route $route, NodeInterface $node) {
    if ($route->hasRequirement('_node_types')) {
      $allowed_node_types = explode(',', $route->getRequirement('_node_types'));
      if (in_array($node->getType(), $allowed_node_types)) {
        return AccessResult::allowed();
      }
    }
    return AccessResult::forbidden();
  }

}
Run Code Online (Sandbox Code Playgroud)