0Pricing
Angular Academy · レッスン

関数型ルートガード

関数型ガードでルートを保護します

「関数型ルートガード」はCoddyKit上の無料Angular Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAngular Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Angular Academyコースには全4レッスンが含まれています。

ルートガードとは

ガードはナビゲーションを進めてよいかどうかを判断します。認証が必要なルートを保護したり、フォームから離れる前に確認したり、ロールによってアクセスを制限したりできます。現在のAngularでは関数形式のガードを使用します。クラスではなく、単純な関数です。

CanActivateFn

CanActivateFnは、許可する場合はtrue、ブロックする場合はfalse、リダイレクトする場合はUrlTree、またはこれらを返すobservableやpromiseを返します。

import { CanActivateFn } from '@angular/router';
import { inject } from '@angular/core';

export const authGuard: CanActivateFn = () => {
  const auth = inject(AuthService);
  return auth.isLoggedIn();
};

guardをルートに接続する

canActivate(配列なので、複数のguardを連結できます)を使ってguardを設定します。

export const routes = [
  { path: 'dashboard', component: DashboardComponent,
    canActivate: [authGuard] }
];

UrlTreeでリダイレクトする

UrlTree(router.createUrlTreeまたはparseUrlから返されるもの)を返すと、ブロックとリダイレクトを1つの手順で行えます。

export const authGuard: CanActivateFn = () => {
  const auth = inject(AuthService);
  const router = inject(Router);
  return auth.isLoggedIn() ? true : router.parseUrl('/login');
};

非同期guard

guardはobservableを返せます。routerは最初の値を待ってから完了します。

export const authGuard: CanActivateFn = () => {
  const auth = inject(AuthService);
  return auth.checkSession$().pipe(
    map(ok => ok ? true : inject(Router).parseUrl('/login'))
  );
};

guardでルート情報にアクセスする

CanActivateFnはActivatedRouteSnapshotとRouterStateSnapshotを受け取るため、params、data、試行されたURLを読み取れます。

export const roleGuard: CanActivateFn = (route, state) => {
  const needed = route.data['role'];
  const auth = inject(AuthService);
  return auth.hasRole(needed);
};

canMatch guard

CanMatchFnは、ルート定義がそもそも一致するかどうかを判断します。feature flagによるルートの切り替えや、許可された場合だけlazy loadする処理に便利です。

import { CanMatchFn } from '@angular/router';

export const featureGuard: CanMatchFn = () =>
  inject(FeatureService).enabled('beta');

canDeactivate guard

CanDeactivateFnはルートを離れるときに実行されます。未保存の変更の確認に最適です。コンポーネントのインスタンスを受け取ります。

import { CanDeactivateFn } from '@angular/router';

export const unsavedGuard: CanDeactivateFn<FormComponent> =
  (component) => component.isPristine() || confirm('Discard changes?');

複数のguardを連結する

配列内のすべてのguardがナビゲーションを許可する必要があります。guardはまとめて実行され、いずれかがfalseまたはUrlTreeを返すと、ナビゲーションはブロックまたはリダイレクトされます。

canActivate: [authGuard, roleGuard]
// both must pass

class guardよりfunctional guardを使う理由

functional guardはよりシンプルです。@Injectableの定型コードが不要で、inject()を簡単に使え、組み合わせやすく、tree-shakingにも対応しています。classベースのCanActivateインターフェースは非推奨です。

guardと子ルート

canActivateChildを使うと、親のすべての子ルートを1か所で保護でき、各子ルートにguardを繰り返し設定する必要がありません。

{ path: 'admin', canActivateChild: [authGuard],
  children: [ /* all protected */ ] }

クイックチェック

functional guardについての理解度を確認しましょう。

まとめ:Functional Route Guard

functional guardは、通常の関数でナビゲーションを制御します。

  • CanActivateFn:許可、ブロック、リダイレクト(UrlTree)を行います。
  • CanMatchFn:ルートがそもそも一致するかを判断します。
  • CanDeactivateFn:離脱を確認します。
  • サービスにはinject()を使い、guardは配列で連結します。

次はrouterイベントとナビゲーションです。

よくある質問

「関数型ルートガード」レッスンは無料ですか?

はい。「関数型ルートガード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Angular Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Angular Academyコースには全4レッスンが含まれています。

「関数型ルートガード」で何を学びますか?

関数型ガードでルートを保護します ブラウザで直接実行するハンズオンコードでAngular Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Angular Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAngular Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「関数型ルートガード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAngular Academyレッスンでコードを書いて実行できますか?

はい。すべてのAngular Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ルートパラメーターとクエリパラメーター
  2. Resolverとルートデータ
  3. 関数型ルートガード
  4. Routerイベントとナビゲーション
← Angular Academyに戻る