メニュー

Gravのライフサイクル

[!訳注]
このページの内容は、色分けが無いととても見にくいのですが、追加 CSS の処理がうまくいかず、現状このような見た目になっています。基本的には、 翻訳元のページ を参照してください。

プラグインから Grav を拡張するベストな方法を理解するために、 Grav のプロセスを知っておくことはしばしば有益です。
Grav のライフサイクルは、以下のとおりです:

index.php

  1. PHP バージョンをチェックし、 7.1.3 以上で実行されていることを確認
  2. Class loader 初期化
  3. Grav インスタンスを取得

    Grav.php

    1. インスタンスが存在しないので、 load() 呼び出し
    2. 追加: loader
    3. 追加し、初期化: debugger
    4. 追加: grav (廃止)
    5. 登録: Default Services
    6. 登録: Service Providers
      1. Accounts Service Provider
        1. 追加: permissions (1.7)
        2. 追加: accounts (1.6)
        3. 追加: user_groups (1.7)
        4. 追加: users (deprecated)
      2. Assets Service Provider
        1. 追加: assets
      3. Backups Service Provider
        1. 追加: backups (1.6)
      4. Config Service Provider
        1. 追加: setup
        2. 追加: blueprints
        3. 追加: config
        4. 追加: languages
        5. 追加: language
      5. Error Service Provider
        1. 追加: error
      6. Filesystem Service Provider
        1. 追加: filesystem
      7. Flex Service Provider
        1. 追加: flex (1.7)
      8. Inflector Service Provider
        1. 追加: inflector
      9. Logger Service Provider
        1. 追加: log
      10. 出力: Service Provider
        1. 追加: output
      11. Pages Service Provider
        1. 追加: pages
        2. 追加: page
      12. Request Service Provider
        1. 追加: request (1.7)
      13. Scheduler Service Provider
        1. 追加: scheduler (1.6)
      14. Session Service Provider
        1. 追加: session
        2. 追加: messages
      15. Streams Service Provider
        1. 追加: locator
        2. 追加: streams
      16. Task Service Provider
        1. 追加: task
        2. 追加: action
      17. Simple Service Providers
        1. 追加: browser
        2. 追加: cache
        3. 追加: events
        4. 追加: exif
        5. 追加: plugins
        6. 追加: taxonomy
        7. 追加: themes
        8. 追加: twig
        9. 追加: uri
  4. Grav::process() を呼び出す

    Grav.php

    1. 実行: 初期化: Processor
      1. Configuration
        1. 初期化: $grav['config']
        2. 初期化: $grav['plugins']
      2. Logger
        1. 初期化: $grav['log']
      3. Errors
        1. 初期化: $grav['errors']
        2. 登録: PHP error handlers
      4. Debugger
        1. 初期化: $grav['debugger']
      5. Handle debugger requests
      6. output buffering を開始
      7. Localization
        1. ロケールとタイムゾーンを設定
      8. Plugins
        1. 初期化: $grav['plugins']
      9. Pages
        1. 初期化: $grav['pages']
      10. Uri
        1. 初期化: $grav['uri']
        2. 追加: $grav['base_url_absolute']
        3. 追加: $grav['base_url_relative']
        4. 追加: $grav['base_url']
      11. リダイレクト制御
        1. リダイレクト時 system.pages.redirect_trailing_slash が true であれば最後のスラッシュを URL に追加
      12. Accounts
        1. 初期化: $grav['accounts']
      13. Session
        1. 初期化: $grav['session'] もし system.session.initializetrue の場合
    2. 実行: Plugins Processor
      1. 発火: onPluginsInitialized イベント
    3. 実行: Themes Processor
      1. 初期化: $grav['themes']
      2. 発火: onThemeInitialized イベント
    4. 実行: Request Processor
      1. 初期化: $grav['request']
      2. 発火: onRequestHandlerInit イベント。以下も一緒に [request, handler]
      3. もし response がイベント内に設定されていれば、それ以上の処理を止め、 response を出力
    5. 実行: Tasks Processor
      1. もし request に次の属性があるとき (controller.class) 及び (task または action):
        1. 実行: そのコントローラー
        2. もし NotFoundException: continue (task と action をチェックする)
        3. もし response code 418: continue (task と action を無視する)
        4. それ以外の場合: それ以上の処理を止め、 response を出力
      2. もし task:
        1. 発火: onTask イベント
        2. 発火: onTask.[TASK] イベント
      3. もし action:
        1. 発火: onAction イベント
        2. 発火: onAction.[ACTION] イベント
    6. 実行: Backups Processor
      1. 初期化: $grav['backups']
      2. 発火: onBackupsInitialized イベント
    7. 実行: Scheduler Processor
      1. 初期化: $grav['scheduler']
      2. 発火: onSchedulerInitialized イベント
    8. 実行: Assets Processor
      1. 初期化: $grav['assets']
      2. 発火: onAssetsInitialized イベント
    9. 実行: Twig Processor
      1. 初期化: $grav['twig']

        Twig.php

        1. Twig テンプレートパスを config 設定をもとに設定
        2. もし利用可能であれば言語テンプレートを制御
        3. 発火: onTwigTemplatePaths イベント
        4. 発火: onTwigLoader イベント
        5. Twig config 及び loader chain を読み込み
        6. 発火: onTwigInitialized イベント
        7. Twig extensions を読み込み
        8. 発火: onTwigExtensions イベント
        9. 標準 Twig 変数 (config, uri, taxonomy, assets, browser, etc) を設定
    10. 実行: Pages Processor
      1. 初期化: $grav['pages']

        Pages.php

        1. 呼び出し: buildPages()
        2. (Flex Pages の場合、少しロジックが違いますが、考え方は同じです)
        3. cache が good かチェック:
        4. もし cache が good load pages date from
        5. もし cache is not good recurse() を呼び出す
        6. recurse() のとき発火: onBuildPagesInitialized イベント
        7. もし .md ファイルが見つかったとき:

          Page.php

          1. 呼び出し: init() ファイルの詳細を読み込む
          2. 以下を設定: filePath, modified, id
          3. 呼び出し: header() header の変数を初期化する
          4. 呼び出し: slug() URL スラッグを設定する
          5. 呼び出し: visible() 変数状態を設定する
          6. 設定: modularTwig() フォルダ名が _ で始まるかどうかを基にしたステータス
        8. 発火: onPageProcessed イベント
        9. もし folder が見つかったらフォルダ内を recurse()
        10. 発火: onFolderProcessed イベント
        11. 呼び出し: buildRoutes()
        12. すべてのページに対して初期化: taxonomy
        13. 検索スピードアップのため route テーブルを作成
      2. 発火: onPagesInitialized イベント with [pages]
      3. 発火: onPageInitialized イベント with [page]
      4. もし page の routable が false:
        1. 発火: onPageNotFound イベント with [page]
      5. もし task:
        1. 発火: onPageTask イベント with [task, page]
        2. 発火: onPageTask.[TASK] イベント with [task, page]
      6. もし action:
        1. 発火: onPageAction イベント with [action, page]
        2. 発火: onPageAction.[ACTION] イベント with [action, page]
    11. 実行: Debugger Assets Processor
      1. Debugbar のときのみ: 追加: デバッグ用 CSS/JS を assets に
    12. 実行: レンダリング: Processor
      1. 初期化: $grav['output']
      2. もし output instanceof ResponseInterface:
        1. それ以上の処理を止め、 response を出力
      3. そうでない時:
        1. Twig の processSite() メソッドでそのページをレンダリング

          Twig.php

          1. 発火: onTwigSiteVariables イベント
          2. ページの出力を取得
          3. 発火: onTwigPageVariables, 及び、各モジュラーサブページへ呼び出し
          4. もしページが見つからない、もしくはルーティング不可の場合、まず onPageFallBackUrl イベントを発火。メディアアセットについてはフォールバックがあるか確認し、無ければ onPageNotFound を発火
          5. Twig オブジェクトにすべての Twig 変数を設定
          6. テンプレート名を file/header/extension 情報をもとに設定
          7. 呼び出し: render() メソッド
          8. 結果の HTML を返す
        2. 発火: onOutputGenerated イベント
        3. 出力バッファに出力を echo
        4. 発火: onOutputRendered イベント
        5. Response オブジェクトを作成
        6. それ以上の処理を止め、 response を出力
    13. 発火: onPageHeaders イベント ページヘッダーを処理する
    14. 出力: HTTP ヘッダと HTTP ボディ
    15. レンダリング: debugger (有効化されているとき)
    16. シャットダウン
      1. session を閉じる
      2. クライアントとの接続を閉じる
      3. 発火: onShutdown イベント

呼び出される content() メソッドがあるページではいつでも、以下のライフサイクルが起こります:

Page.php

  1. もし content がキャッシュ されていない 場合:
    1. 発火: onPageContentRaw イベント
    2. マークダウンと Twig の設定をもとにページを処理。 発火: onMarkdownInitialized イベント
    3. 発火: onPageContentProcessed イベント
  2. 発火: onPageContent イベント