web-dev-qa-db-ja.com

現在のページが管理ページかどうかをテストする方法は?

ある時点で、次のコードを使用して、現在のページが管理ページであるかどうかをテストし始めました。

  $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で現在のルートをロードしているところだと思います。

9
oknate

*更新*

私が最初にこの質問に回答したとき、ノード編集ページと分類編集ページは管理ルートとして設定されていませんでした。そのため、それらの個別のチェックを追加しました。このような個別のチェックはもう必要ありません。以下はそれをかなりうまくカバーしているようです:

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;
    }
  }
19
oknate

以下はもう少し簡潔で、管理テーマを使用するように構成されている場合にノード編集ページもキャプチャします。 isAdminRouteメソッドは、何も指定されていない場合、現在のルートを使用します。

  /** @var \Drupal\Core\Routing\AdminContext $admin_context */
  $admin_context = \Drupal::service('router.admin_context');
  if (!$admin_context->isAdminRoute()) {
    // perform tasks.
  }
9
Shaun Dychko