Drupal 8 如何定义动态路由?

逆流の鱼, 20 三月, 2019

动态路由,即'/node/{node}/edit'这样的路径。

官方文档:Structure of routes

例子:my_module.routing.yml

round_robin.content:
  path: '/node/{node}/round-robin'
  defaults:
    _controller: '\Drupal\round_robin\Controller\RoundRobinController::content'
    _title_callback: '\Drupal\round_robin\Controller\RoundRobinController::title'
  requirements:
    _entity_access: 'node.update'
    node: ^\d+$
  options:
    parameters:
      node:
        type: 'entity:node'

简单解释:

_controller :对应模块controller里的显示内容function

_title_callback:对应模块controller里的显示标题function

_entity_access: 'node.update':要求当前用户对该节点有编辑的权限

node: ^\d+$:表示{node}只能是数字

options: parameters: node: type: 'entity:node':这个官方文档没提及,但必须有,大概是表示{node}是个参数,而且要是个node entity。

更进一步,如何定义某个node type的动态路由?

上面的例子:/node/{node}/round-robin,会对所有node添加这个路由;但如果我只针对某个node type才添加这个路由呢?譬如说:node/1 是个ariticle,node/2是个page,我只想node/1/round-robin有效。这时,就要在代码中requirements下添加_custom_access

requirements:
  _custom_access: '\Drupal\mymodule\Controller\CheckTestController::checkAccess'

通过模块中的checkAccess()检测entity type是否article,并返回true/false。

 

更多链接:

Routing system详解

Route access check for local task

 

评论