メニュー

Grav 1.6 へのアップデート

Grav 1.6 は、Grav の最初のリリース以来、最大のアップデートでした。いくつかの新機能追加、改善、バグ修正がなされ、そして Grav 2.0 への道を開くたくさんのアーキテクチャの変更が提供されています。

[!Warning]
重要: 多くの人にとって、 Grav 1.6 は何の問題もなく簡単にアップグレードできるものです。しかし、あらゆるアップグレードがそうであるように、サイトのアップグレード前には、サイトの バックアップを取りテスト環境でアップグレードのテストをしてください

あなたが開発者もしくはサイト管理者であれば、テストサイトでは デバッグバー を有効化してください。なぜなら、デバッグバーには、いくつかの便利なツールがあり、それらによって、 Grav のそれ以降のバージョンで動作する準備を確実にしてくれるからです。

[!TIP]
機能を有効化する方法に関するより詳しい情報は、このドキュメントの デバッグとログ セクションを参照してください。

デバッグバーの deprecated タブ

デバッグバーの Deprecated (非推奨) タブを見てください。 このタブは、非推奨の問題を特定し、 Grav を新しいバージョンへアップグレードする前に、それらを修正したり、レポートしたりしてくれます。 Deprecated タブ内にある問題を修正ことで、サイトは速くなり、将来アップグレードする時間を削減してくれます。

Deprecated Tab

[!Note]
Deprecated タブに表示されるのは、そのページで非推奨のコールが検出されたときだけです。

すべての問題を確実に捕まえるために、キャッシュをクリアし、キャッシュを無効化して Grav を実行すべきです。そうすることで、すべてのエラーを捕まえる可能性が最大化されます。以下の手順を進める際でさえ、キャッシュのクリア後にのみ YAML/Twig エラーのいくつかが現れることに気がつくかもしれません。

Deprecated タブには、見つかった非推奨機能のリストが掲載されます。すべての問題について、クリックして非推奨に関するメッセージを開くことができます。このメッセージは、問題と問題の所在をさかのぼる簡単な説明文で、このメッセージのおかげで、コードの場所が分かり、修正できるようになります。右側には、非推奨エラーのタイプが表示されます。右下のバッジをクリックすることにより、表示されたタイプをフィルタリングできます。

非推奨メッセージを開いたとき、最初のうちはその内容に圧倒されるかもしれません。しかし多くの場合、必要なのは最初の数行で、(メッセージと、ファイルと、もしあれば行数)で、ほとんどの内容は無視できます。

非推奨の問題は、いくつかのタイプに分けられます:

  • yaml: YAML もしくはマークダウンファイルで、非推奨の YAML 構文を使っている。
  • twig: Twig ファイルに、非推奨の Twig 構文を含んでいるか、もしくはそれ以外の Twig 関係の問題。
  • grav: Grav の非推奨のメソッドもしくはプロパティが使われている。
  • vendor: 非推奨のサードパーティ製ライブラリコードが使われている。
  • unknown: 上記以外の非推奨メッセージ。

YAML のパース

[!Note]
Grav 1.6 では、 YAML は後方互換性のフォールバックにより厳密にパースされます。

Grav 1.6 では、 Symfony 4.2 YAML parser が使われます。これは、以前の Symfony 3.4 のパーサーよりも、より厳密に YAML 標準仕様 に従っています。これはつまり、以前機能していた YAML ファイルであっても、妥当でない YAML であればエラーを起こしうるということです。しかし、ファイルが 4.2 バージョンのパーサーで読み込み失敗したとしても、 Grav はデフォルトで古い 3.4 バージョンのパーサーで読み込み、サイトを運用し続けます。とはいえ、このことはサイトパフォーマンスを悪化させるので、問題を見つけ、修正し、パフォーマンスを最適化すべきです。

[!Note]
このフォールバック機構は、 Grav 2.0 で削除予定です。

Grav 1.6.7 以降では、 YAML パース時の問題を検出する CLI コマンドが新しく追加されました。 bin/grav yamllinter を実行し、サイト内の YAML パースエラーを見つけ、修正してください。 Grav 1.6 以上にアップグレードした直後に、このコマンドを実行することをおすすめします。

管理パネルプラグイン 1.9.3 以降では、 YAML LinterTools > Reports に統合していますので、 CLI コマンドのかわりにこちらを利用することもできます。

YAML エラーの探し方
  • クオテーションマークで囲んでいない文字列の最初を @, \, |, % そして > で始めないでください。 @data-options: [] を使わないでください。代わりに、 data-options@: [] を使ってください。
  • すべてのキーについて、コロン : の後はホワイトスペースを入れてください。 key:value ではなく、 key: value を使用してください。
  • すべてのキーについて、 null, true, false, 2.0 (実数値) は、クオテーションマークで囲んでください。キーは、整数もしくは文字列のみです。
  • 同様に、値の null, true, false, 2 そして 2.0 は、それが文字列を意味するのであれば、クオテーションマークで囲んでください。
  • 文字列をダブルクオテーションで囲む場合は、 \ 文字でエスケープしなければいけません。

また、デバッグバーで、非推奨の YAML を見つけることができます。デバッグバーを開き、 Deprecation タブを見るだけです。タブが見当たらない場合は、問題は検出されていません。

[!Tip]
デバッグバーの 右下隅のバッジ で、 YAML 問題をフィルタリングできます。 YAML 以外のボタンをクリックすることで、それらを無効化するだけで、簡単に YAML 問題だけをフィルタリングして表示できます。

[!Note]
YAML エラーは、キャッシュクリアを必要とします。エラーは、 YAML ファイルが読み取られるときにだけ検出されます。

YAML 互換モード

デフォルトでは、 YAML 互換モードは、 Grav 1.6 で有効化されています。これにより、アップグレード後も、古いサイトを動かし続けることができますが、この状態は、新しいサイトでは理想的とは言えません。YAML パースのエラーについて、修正し、テストをしてください。

この設定は、 user/config/system.yaml で変更できます:

strict_mode:
  yaml_compat: false

既存サイトでは、この設定を触らないことをおすすめします。むしろ、互換モードを false にして、テストサイトを作成してください。Grav 1.6 以上で作成された新しいサイトは、すべて互換モードが無効化しておいてください。これにより、 Grav 2.0 にアップグレードする際には、多くの時間が削減できます。

Twig

遅延ブロック

あなたのテーマをアップデートして、 Grav 1.6 で提供された遅延アセットブロックがサポートされるようにしてください。もしくは、テーマを修正してカスタムテーマにしていたり、独自のテーマを開発している場合は、ご自身でこの新しい機能と、Grav とそのプラグインの新しいバージョンが使えるようにしてください。以下のブログ投稿が参考になります: Important Theme Updates

Twig における非推奨

Grav 1系で、現在使われている Twig 1系の代わりに、Grav 2.0 では、 Twig 2系 を使う予定です。Twig 2 では、いくつかの非推奨機能があります。このため、 Grav 2.0 へアップグレードする前に、これらの問題をすべて見つけ出し、修正しておくと良いでしょう。

デバッグバーでは、 Twig の非推奨問題を見つけることができます。デバッグバーを開き、 Deprecated タブをクリックしてください。

Twig 問題の探し方
  • ファイルでインポートしたマクロは、(include 呼び出し経由の)子テンプレートでは利用できない。これらで利用する場合は、各ファイルで明示的にマクロをインポートする必要。
  • |replace() フィルタは、パラメータとして連想配列が渡されたときのみ機能する:{ "I like this and that."|replace({'this': 'foo', 'that': 'bar'}) }}.
  • sameas() によるテストは、 same as() と書かれるべき。

非推奨に関するより詳しい情報は、 このページで見つかります

オートエスケープ

Grav は、 XSS 攻撃を除けば、脆弱性からは安全です。XSS 攻撃は、ユーザーからの信頼できない入力を適切にエスケープしていないコードがあれば、大した労力もなく発生してしまう脆弱性です。Twig は、テンプレートファイルを簡単に作成できますが、同時に、テンプレートファイル内で使われる多くの変数について、それらをサニタイズすることも忘れられがちです。たとえ入力がフィルタリングされ、安全であったとしても、本来エスケープされるべき特殊文字が含まれていて、適切な HTML コードが作成されない可能性があります。

たとえば、以下のような Twig テンプレートがあったとします:

{% set my_string = '<script>echo("hello there!");<script>' %}
<p>
    {{ my_string }}
</p>

デフォルトでは、 Grav は Twig オートエスケープを無効化して 、テンプレートのシンプル化、クリア化してきましたが、不幸なことに、これは良くない決定でした。特殊文字が含まれるかもしれない、もしくは信頼できないソースからの変数に、常にエスケープし続けることを覚えていられる人など、私たちも含め、誰もいなかったからです。より悪いことに、その変数が HTML 安全かどうかも、通常は分からないものです。ほとんどの XSS 脆弱性からサイトを守るには、 config 設定でオートエスケープを有効化すべきです。不幸なことに、 Twig テンプレートを使うテーマやプラグインは、この設定が有効化されていると機能しない傾向があります。 — そして、明示的にエスケープされていないテンプレートは、悪意のあるコンテンツに対して脆弱である場合が多いです。

上記の例では、オートエスケープが無効化されているので、出力はピュアな HTML としてレンダリングされるでしょう。そして、アラートボックスが "hello there!" とポップアップされます。しかし、 Twig エスケープフィルタの |e もしくは e|('html') を使って、この部分をエスケープするべきです:

{% set my_string = '<script>echo("hello there!");<script>' %}
<p>
    {{ my_string|e }}
</p>

多くの人は、 Twig 内の変数をエスケープし忘れる傾向にあり、すべての場所に |e を使うのはテンプレートファイルの可読性を落とすため、 user/config/system.yaml に新しい設定が用意されました:

strict_mode:
  twig_compat: false

この設定は、すべての Twig テンプレートファイル内で、 オートエスケープ を有効化することに特化しています。そして、オートエスケープの有効化・無効化の古い設定を破棄します。この設定の副作用として、サイトには、いくつかのコンテンツのかけらが残されます。それらは、コンテンツが無理にエスケープされたもので、 |raw フィルタを使って HTML を、 HTML のみを含むように修正されなければいけません。多くのテンプレートとプラグインは、強制エスケープに対応したアップデートをしていません。そのため、これらの修正が必要なバグについて、速やかに報告をお願いします。

オートエスケープを使うための変更については、簡単なものではありません。変更中に、すべてのテンプレートファイルには、 |e と、 |raw の両方のフィルタが存在し、テンプレートファイルがどちらのモードでも安全になるようにしなければなりません。もしくは、 Twig タグの {% autoescape %} を使うこともできます。

より詳しい情報は、 Twig マニュアル をご覧ください。