ある時点で、次のコードを使用して、現在のページが管理ページであるかどうかをテストし始めました。
$route = \Drupal::routeMatch()->getRouteObject();
$is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);
しかし、hook_entity_load()のノード編集ページでこれが失敗することがわかりました。
Drupal 8?の管理ページにいるかどうかをどのようにテストしますか?Drupal 7?のpath_is_admin()など
このページのコード( https://api.drupal.org/api/drupal/includes%21path.inc/function/path_is_admin)を使用して、hook_entity_loadの外側から同じノード編集ページのパスをテストすると、 /7.x )動作します。
use Symfony\Component\HttpFoundation\Request;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
$path = '/node/75/edit';
$request = Request::create($path);
$route_match = \Drupal::service('router.no_access_checks')->matchRequest($request);
$route = $route_match[RouteObjectInterface::ROUTE_OBJECT];
$is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);
しかし、現在のパスを使用してこのコードをhook_entity_loadに追加しようとすると、致命的なループが発生します。
私が行き詰まっているのは、hook_entity_loadで現在のルートをロードしているところだと思います。
*更新*
私が最初にこの質問に回答したとき、ノード編集ページと分類編集ページは管理ルートとして設定されていませんでした。そのため、それらの個別のチェックを追加しました。このような個別のチェックはもう必要ありません。以下はそれをかなりうまくカバーしているようです:
if (\Drupal::service('router.admin_context')->isAdminRoute()) {
// do stuff
}
現在のルート以外のルートを確認したい場合は、isAdminRoute()に渡すことができます。
/ admin/appearanceのテーマ管理ページで[コンテンツを編集または作成するときに管理テーマを使用する]をオフにすると、上記の方法はノード編集ページまたは分類用語編集ページでは機能しません。次に、別のチェックが必要になります。
*元の回答:*
ページが管理ページかどうかをテストするには、2段階のプロセスを使用できます。ノード編集の正規表現は管理テーマを使用していない可能性があるため。
最初にisAdminRouteメソッドを使用します:
$route = \Drupal::routeMatch()->getRouteObject();
$is_admin = \Drupal::service('router.admin_context')->isAdminRoute($route);
次に、パスの追加チェックを使用して、ノード編集ページかどうかを確認できます:
$current_path = \Drupal::service('path.current')->getPath();
if(preg_match('/node\/(\d+)\/edit/', $current_path, $matches)) {
$is_admin = TRUE;
}
これはかなり複雑ですが、ノードと分類用語の編集ページや他の管理ルートをテストするためのかなり完全な方法です。
$route = \Drupal::routeMatch()->getRouteObject();
$is_admin = FALSE;
if (!empty($route)) {
$is_admin_route = \Drupal::service('router.admin_context')->isAdminRoute($route);
$has_node_operation_option = $route->getOption('_node_operation_route');
$is_admin = ($is_admin_route || $has_node_operation_option);
}
else {
$current_path = \Drupal::service('path.current')->getPath();
if(preg_match('/node\/(\d+)\/edit/', $current_path, $matches)) {
$is_admin = TRUE;
}
elseif(preg_match('/taxonomy\/term\/(\d+)\/edit/', $current_path, $matches)) {
$is_admin = TRUE;
}
}
以下はもう少し簡潔で、管理テーマを使用するように構成されている場合にノード編集ページもキャプチャします。 isAdminRoute
メソッドは、何も指定されていない場合、現在のルートを使用します。
/** @var \Drupal\Core\Routing\AdminContext $admin_context */
$admin_context = \Drupal::service('router.admin_context');
if (!$admin_context->isAdminRoute()) {
// perform tasks.
}