ログインしたユーザーの役割に基づいて、いくつかのメインメニューを紹介する必要があります。たとえば、ロールを持つユーザーAはいくつかのメニューを見ることができ、ロールBを持つユーザーはいくつかのメニューの別のセットを見ることができます。
これは、アクセス許可を管理するルートを使用して実現できます。次の例を見てください。
mymodule.routing.yml
mymodule.home:
path: '/mymodule'
defaults:
_controller: '\Drupal\mymodule\Controller\MyModuleController::overview'
_title: 'My Module'
requirements:
_role: 'authenticated user'
mymodule.settings:
path: '/admin/mymodule'
defaults:
_form: 'Drupal\mymodule\Form\MyModuleSettingsForm'
_title: 'Settings'
requirements:
_permission: 'administer mymodule'
mymodule.view:
path: '/mymodule/view'
defaults:
_controller: '\Drupal\mymodule\Controller\MyModuleController::view'
_title: 'View'
requirements:
_role: 'authenticated user'
mymodule.edit:
path: '/mymodule/edit'
defaults:
_form: 'Drupal\mymodule\Form\MyModuleEditForm'
_title: 'Edit'
requirements:
_permission: 'edit mymodule'
mymodule.links.menu.yml
mymodule.home:
title: 'My Module'
parent: main
route_name: mymodule.home
weight: 10
mymodule.settings:
title: 'Settings'
parent: mymodule.home
route_name: mymodule.settings
weight: 10
mymodule.view:
title: 'View'
parent: mymodule.home
route_name: mymodule.view
weight: 10
mymodule.edit:
title: 'Edit'
parent: mymodule.home
route_name: mymodule.edit
weight: 10
このアプローチでは、すべてのユーザーに同じメニューを表示できますが、リンクはルートから権限を取得するため、administer mymodule
権限を持つユーザーのみが[設定]リンクを表示できます。 _role: '$rid'
を使用して、ロールを使用して管理することもできます。
Drupal 8では、funky.module
ファイルでプログラムによるアプローチのために次のコードを使用することもできます。以下のアプローチでは、メニューの表示とは関係なくアクセスルールを設定できます。
/**
* Implements hook_preprocess_menu().
*
* @param array[] $variables
*/
function funky_preprocess_menu(&$variables) {
if (in_array('role_b', Drupal::currentUser()->getRoles())) {
// Hide the menu item
unset($variables['items']['the_key_you_used_in_your_menu_links_yml_file']);
}
}
これは、モジュールがfunky
と呼ばれることを前提としています。また、次のようなものが含まれるfunky.links.menu.yml
ファイルがあることも前提としています。
the_key_you_used_in_your_menu_links_yml_file:
title: 'Your menu caption'
route_name: your_route
menu_name: account
cache_contexts:
- user.roles
ユーザーに役割があるかどうかのみを区別する場合は、その役割によってcache_contextをさらに強化できます。上記の例では、user.roles:role_b
が適切です。キャッシュコンテキストのドキュメントはこちら: https://www.drupal.org/docs/8/api/cache-api/cache-contexts
Menu Item Role Access を使用するだけです。コードを書くよりもずっと簡単になります。