Nette Documentation Preview

syntax
用語集
***


AJAX
----
Asynchronous JavaScript and XML - リクエストのたびにページ全体を読み込み直さずに、HTTP のプロトコルでクライアントとサーバーのあいだの情報をやり取りする技術です。名前からはデータが XML の形式でだけ送られるように見えますが、[#JSON]の形式もよく使われます。


プレゼンターのアクション
------------
ひとつの操作を行うプレゼンターの論理的な部分です。たとえば商品のページを表示する、利用者をログアウトさせる、といったことです。ひとつのプレゼンターは複数のアクションを持てます。


BOM
---
*byte order mark* はファイルの先頭の特別な文字で、文字コードのバイトの並び順を示すのに使われます。エディタによってはファイルに入れてしまいます。ほとんど目に見えませんが、PHP からの出力とヘッダーの送信で問題を起こします。まとめて取り除くには [Code Checker|tools:code-checker]を使えます。


Controller
----------
利用者のリクエストを処理し、それをもとにふさわしいアプリケーションの論理(つまり[#モデル])を呼び、そのあと[#ビュー]にデータを描くよう頼むものです。Nette Framework で controller にあたるのが[プレゼンター |#Presenter]です。


Cross-Site Scripting (XSS)
--------------------------
Cross-Site Scripting は、エスケープされていない出力を悪用してウェブサイトを乱す手口です。攻撃者は自分のコードをページに差し込み、ページを書き換えたり、訪問者の機微なデータを手に入れたりできてしまいます。XSS に対する守りは、出力されるすべての文字列を一貫して正しくエスケープすることです。

Nette Framework は画期的な [Context-Aware Escaping |latte:safety-first#コンテキストに応じたエスケープ]の技術を持ち込み、Cross-Site Scripting の危険を永久に取り除きます。すべての出力を自動的にエスケープするので、開発者が何かを忘れることはありません。


Cross-Site Request Forgery (CSRF)
---------------------------------
Cross-Site Request Forgery の攻撃では、攻撃者が被害者をあるページへ誘い込み、そのページが被害者のブラウザの中で、被害者がログインしているサーバーへのリクエストをこっそり実行します。サーバーはそのリクエストが被害者の意思で行われたと信じてしまいます。こうして被害者の身元で、本人の知らないうちに操作が行われます。データの書き換えや削除、メッセージの送信などです。

Nette Framework は、フォームとプレゼンターのシグナルを別のドメインから送信したり起こしたりできないようにして、**この種の攻撃から自動的に守ります**。


Cross-Origin Resource Sharing (CORS)
------------------------------------
CORS は、ウェブページが、それを読み込んだドメインとは別のドメインへ JavaScript でリクエストを送れるようにする安全のしくみです。CORS がなければ、ブラウザは安全のためにそうしたリクエストを遮ります。

たとえばあなたのウェブサイトが `https://myapp.com` で動いていて、JavaScript(AJAX、Fetch API)で `https://api.example.com` からデータを取ろうとすると、ブラウザは API のサーバーがこの別オリジンのリクエストを許すかを確かめます。API のサーバーは許可を与えるために、`Access-Control-Allow-Origin: https://myapp.com` のような特別な HTTP のヘッダーで応えなければなりません。


Dependency Injection
--------------------
Dependency Injection(DI)は、オブジェクトの生成とその依存関係をどう分けるかを示す設計のパターンです。つまりクラスは自分の依存関係を作ったり用意したりする責任を負わず、それらの依存関係は外のコード([DI コンテナ |#Dependency Injection コンテナ]かもしれません)が与えます。利点はコードがしなやかになり、理解しやすくなり、アプリケーションのテストが楽になることです。依存関係は簡単に取り替えられ、ほかのコードから切り離されているからです。詳しくは [Dependency Injection とは |dependency-injection:introduction]の章をご覧ください。


Dependency Injection コンテナ
--------------------------
Dependency Injection コンテナ(DI コンテナ、IoC コンテナとも)は、アプリケーションの中の依存関係(つまり[サービス |#サービス])の生成と管理を受け持つ道具です。コンテナにはふつう、どのクラスがどれに依存するか、依存関係のどの具体的な実装を使うか、それらの依存関係をどう作るかを定める設定があります。そしてコンテナはそれらのオブジェクトを作り、必要とするクラスに与えます。詳しくは [DI コンテナとは |dependency-injection:container]の章をご覧ください。


エスケープ
-----
エスケープとは、ある文脈で特別な意味を持つ文字を、それに対応する別の並びに変えることです。例を挙げます。引用符で囲まれた文字列の中に引用符を書きたいとします。引用符は文字列の文脈では特別な意味を持ち、そのまま書けば文字列の終わりと解釈されるので、それに対応する別の並びで書かなければなりません。正確な並びはその文脈の決まりが定めます。


フィルタ
----
テンプレートでの[フィルタ |latte:syntax#フィルタ]は、ふつうデータを最終的な形に変えたり整えたりするのを助ける関数を指します。テンプレートにはいくつもの[標準のフィルタ |latte:filters]があります。


無効化
---
[スニペット |#スニペット]に描き直すよう知らせることです。別の文脈では、キャッシュの中身を消すことも意味します。


JSON
----
JavaScript の構文をもとにしたデータ交換の形式です(その部分集合です)。正確な仕様は www.json.org にあります。


コンポーネント
-------
アプリケーションの再利用できる部分です。[コンポーネントを書く |application:components]の章で説明されているページの目に見える部分のこともありますし、コンポーネントという語は [Component |component-model:]クラスを指すこともあります(そうしたコンポーネントは目に見えるとは限りません)。


制御文字
----
制御文字は、文の中に紛れ込んで問題を起こしうる、目に見えない文字です。ファイルからまとめて取り除くには [Code Checker|tools:code-checker]を、変数から取り除くには [Strings::normalize() |utils:strings#normalize()]関数を使えます。


イベント
----
イベントとは、オブジェクトの中で起きることが見込まれている状況です。それが起きると、いわゆるハンドラ、つまりそのイベントに反応するコールバックが呼ばれます("例":https://gist.github.com/dg/332cdd51bdf7d66a6d8003b134508a38 をご覧ください)。イベントはたとえばフォームの送信や利用者のログインなどです。ですからイベントは *Inversion of Control* のひとつの形です。

たとえば利用者のログインは `Nette\Security\User::login()` メソッドで起こります。`User` オブジェクトには public の変数 `$onLoggedIn` があり、これは誰でもコールバックを足せる配列です。利用者がログインすると、`login()` メソッドが配列のすべてのコールバックを呼びます。`onXyz` という変数名の形は、Nette 全体で使われている決まりです。


Latte
-----
もっとも進んだ[テンプレートシステム |latte:]のひとつです。


モデル
---
モデルはデータであり、とりわけアプリケーション全体の機能の核です。アプリケーションのすべての論理(ビジネスロジックとも呼ばれます)を含みます。**M**VC や MVP の **M** です。利用者のどの操作(ログイン、商品をかごに入れる、データベースの値を変える)も、モデルの操作を表します。

モデルは自分の内部の状態を管理し、外に向けては決まったインターフェースを差し出します。そのインターフェースの関数を呼ぶことで、状態を尋ねたり変えたりできます。モデルは[#ビュー]や[#Controller]の存在を知りません。


Model-View-Controller
---------------------
図の操作を持つアプリケーションで、操作を扱うコード([#Controller])、アプリケーションの論理のコード([#モデル])、データを表示するコード([#ビュー])を分ける必要から生まれたソフトウェアの設計です。おかげでアプリケーションは見通しがよくなり、あとからの開発が楽になり、それぞれの部分を別々にテストできます。


Model-View-Presenter
--------------------
[#Model-View-Controller]をもとにした設計です。


モジュール
-----
モジュールはアプリケーションの論理的な部分を表します。ふつうの配置では、特定の機能の領域を受け持つプレゼンターとテンプレートのまとまりです。モジュールは `Front/`、`Admin/`、`Shop/` のような[別々のディレクトリ |application:directory-structure#プレゼンターとテンプレート]に置かれます。

たとえばネットショップは次のように分けられます。
- 商品を見て買うための表側(`Shop/`)
- 注文を管理するための顧客の区画(`Customer/`)
- 運営者のための管理画面(`Admin/`)

技術的にはふつうのディレクトリですが、はっきりした構造のおかげでアプリケーションの規模を広げやすくなります。ですからプレゼンター `Admin:Product:List` は、たとえば `app/Presentation/Admin/Product/List/` のディレクトリに置かれます([プレゼンターの対応づけ |application:directory-structure#プレゼンターのマッピング]をご覧ください)。


Namespace
---------
名前空間は、バージョン 5.3 以降の PHP と、ほかのいくつかのプログラミング言語にある機能で、違うライブラリの同じ名前のクラスを名前の衝突なしに使えるようにします。[PHP のドキュメント |https://www.php.net/manual/en/language.namespaces.rationale.php]をご覧ください。


Presenter
---------
プレゼンターは、HTTP のリクエストからルーターが読み解いた[リクエスト |api:Nette\Application\Request]を受け取り、[レスポンス |api:Nette\Application\Response]を作るオブジェクトです。レスポンスは HTML のページ、画像、XML の文書、ディスクのファイル、JSON、リダイレクト、そのほかあなたが思いつくものなら何でもかまいません。

ふつうプレゼンターという語は [api:Nette\Application\UI\Presenter]クラスの子孫を指します。届いたリクエストをもとに、対応する[アクション |application:presenters#プレゼンターのライフサイクル]を実行し、テンプレートを描きます。


Router
------
HTTP のリクエストや URL と、プレゼンターのアクションとのあいだの双方向の翻訳器です。双方向とは、HTTP のリクエストから[プレゼンターのアクション |#プレゼンターのアクション]を導けて、逆にアクションから対応する URL を作れることです。詳しくは [URL のルーティング |application:routing]の章をご覧ください。


SameSite cookie
---------------
SameSite クッキーは、ページの読み込みが何によって起きたかを見分けるしくみを与えます。値は 3 つで、`Lax`、`Strict`、`None` です(最後のものには HTTPS が要ります)。ページへのリクエストがそのウェブサイト自身から来た場合、あるいは利用者がアドレス欄に直接打ち込んだりブックマークをクリックしたりしてページを開いた場合、ブラウザはすべてのクッキーをサーバーへ送ります(つまり `Lax`、`Strict`、`None` のフラグの付いたものすべてです)。利用者がよそのサイトのリンクからそのウェブサイトへたどり着いた場合は、`Lax` と `None` のフラグの付いたクッキーがサーバーへ渡されます。リクエストがそれ以外のやり方、たとえばよそのサイトからの POST のフォームの送信、iframe の中での読み込み、JavaScript の利用などで起きた場合は、`None` のフラグの付いたクッキーだけが送られます。


サービス
----
Dependency Injection の文脈でのサービスは、DI コンテナが作って管理するオブジェクトを指します。サービスは、たとえばテストのためやアプリケーションの振る舞いを変えるために、それを使うコードに手を入れずに別の実装へ簡単に取り替えられます。


スニペット
-----
スニペット、つまり AJAX のリクエストのときに独立して描き直せるページの一部です。


ビュー
---
ビューは、リクエストの結果を表示することを受け持つアプリケーションの層です。ふつうはテンプレートシステムを使い、特定のコンポーネントやモデルから得た結果をどう表示するかを知っています。





{{priority: -2}}

用語集

AJAX

Asynchronous JavaScript and XML – リクエストのたびにページ全体を読み込み直さずに、HTTP のプロトコルでクライアントとサーバーのあいだの情報をやり取りする技術です。名前からはデータが XML の形式でだけ送られるように見えますが、JSONの形式もよく使われます。

プレゼンターのアクション

ひとつの操作を行うプレゼンターの論理的な部分です。たとえば商品のページを表示する、利用者をログアウトさせる、といったことです。ひとつのプレゼンターは複数のアクションを持てます。

BOM

byte order mark はファイルの先頭の特別な文字で、文字コードのバイトの並び順を示すのに使われます。エディタによってはファイルに入れてしまいます。ほとんど目に見えませんが、PHP からの出力とヘッダーの送信で問題を起こします。まとめて取り除くには Code Checkerを使えます。

Controller

利用者のリクエストを処理し、それをもとにふさわしいアプリケーションの論理(つまりモデル)を呼び、そのあとビューにデータを描くよう頼むものです。Nette Framework で controller にあたるのがプレゼンターです。

Cross-Site Scripting (XSS)

Cross-Site Scripting は、エスケープされていない出力を悪用してウェブサイトを乱す手口です。攻撃者は自分のコードをページに差し込み、ページを書き換えたり、訪問者の機微なデータを手に入れたりできてしまいます。XSS に対する守りは、出力されるすべての文字列を一貫して正しくエスケープすることです。

Nette Framework は画期的な Context-Aware Escapingの技術を持ち込み、Cross-Site Scripting の危険を永久に取り除きます。すべての出力を自動的にエスケープするので、開発者が何かを忘れることはありません。

Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery の攻撃では、攻撃者が被害者をあるページへ誘い込み、そのページが被害者のブラウザの中で、被害者がログインしているサーバーへのリクエストをこっそり実行します。サーバーはそのリクエストが被害者の意思で行われたと信じてしまいます。こうして被害者の身元で、本人の知らないうちに操作が行われます。データの書き換えや削除、メッセージの送信などです。

Nette Framework は、フォームとプレゼンターのシグナルを別のドメインから送信したり起こしたりできないようにして、この種の攻撃から自動的に守ります

Cross-Origin Resource Sharing (CORS)

CORS は、ウェブページが、それを読み込んだドメインとは別のドメインへ JavaScript でリクエストを送れるようにする安全のしくみです。CORS がなければ、ブラウザは安全のためにそうしたリクエストを遮ります。

たとえばあなたのウェブサイトが https://myapp.com で動いていて、JavaScript(AJAX、Fetch API)で https://api.example.com からデータを取ろうとすると、ブラウザは API のサーバーがこの別オリジンのリクエストを許すかを確かめます。API のサーバーは許可を与えるために、Access-Control-Allow-Origin: https://myapp.com のような特別な HTTP のヘッダーで応えなければなりません。

Dependency Injection

Dependency Injection(DI)は、オブジェクトの生成とその依存関係をどう分けるかを示す設計のパターンです。つまりクラスは自分の依存関係を作ったり用意したりする責任を負わず、それらの依存関係は外のコード(DI コンテナかもしれません)が与えます。利点はコードがしなやかになり、理解しやすくなり、アプリケーションのテストが楽になることです。依存関係は簡単に取り替えられ、ほかのコードから切り離されているからです。詳しくは Dependency Injection とはの章をご覧ください。

Dependency Injection コンテナ

Dependency Injection コンテナ(DI コンテナ、IoC コンテナとも)は、アプリケーションの中の依存関係(つまりサービス)の生成と管理を受け持つ道具です。コンテナにはふつう、どのクラスがどれに依存するか、依存関係のどの具体的な実装を使うか、それらの依存関係をどう作るかを定める設定があります。そしてコンテナはそれらのオブジェクトを作り、必要とするクラスに与えます。詳しくは DI コンテナとはの章をご覧ください。

エスケープ

エスケープとは、ある文脈で特別な意味を持つ文字を、それに対応する別の並びに変えることです。例を挙げます。引用符で囲まれた文字列の中に引用符を書きたいとします。引用符は文字列の文脈では特別な意味を持ち、そのまま書けば文字列の終わりと解釈されるので、それに対応する別の並びで書かなければなりません。正確な並びはその文脈の決まりが定めます。

フィルタ

テンプレートでのフィルタは、ふつうデータを最終的な形に変えたり整えたりするのを助ける関数を指します。テンプレートにはいくつもの標準のフィルタがあります。

無効化

スニペットに描き直すよう知らせることです。別の文脈では、キャッシュの中身を消すことも意味します。

JSON

JavaScript の構文をもとにしたデータ交換の形式です(その部分集合です)。正確な仕様は www.json.org にあります。

コンポーネント

アプリケーションの再利用できる部分です。コンポーネントを書くの章で説明されているページの目に見える部分のこともありますし、コンポーネントという語は Componentクラスを指すこともあります(そうしたコンポーネントは目に見えるとは限りません)。

制御文字

制御文字は、文の中に紛れ込んで問題を起こしうる、目に見えない文字です。ファイルからまとめて取り除くには Code Checkerを、変数から取り除くには Strings::normalize()関数を使えます。

イベント

イベントとは、オブジェクトの中で起きることが見込まれている状況です。それが起きると、いわゆるハンドラ、つまりそのイベントに反応するコールバックが呼ばれます( をご覧ください)。イベントはたとえばフォームの送信や利用者のログインなどです。ですからイベントは Inversion of Control のひとつの形です。

たとえば利用者のログインは Nette\Security\User::login() メソッドで起こります。User オブジェクトには public の変数 $onLoggedIn があり、これは誰でもコールバックを足せる配列です。利用者がログインすると、login() メソッドが配列のすべてのコールバックを呼びます。onXyz という変数名の形は、Nette 全体で使われている決まりです。

Latte

もっとも進んだテンプレートシステムのひとつです。

モデル

モデルはデータであり、とりわけアプリケーション全体の機能の核です。アプリケーションのすべての論理(ビジネスロジックとも呼ばれます)を含みます。MVC や MVP の M です。利用者のどの操作(ログイン、商品をかごに入れる、データベースの値を変える)も、モデルの操作を表します。

モデルは自分の内部の状態を管理し、外に向けては決まったインターフェースを差し出します。そのインターフェースの関数を呼ぶことで、状態を尋ねたり変えたりできます。モデルはビューControllerの存在を知りません。

Model-View-Controller

図の操作を持つアプリケーションで、操作を扱うコード(Controller)、アプリケーションの論理のコード(モデル)、データを表示するコード(ビュー)を分ける必要から生まれたソフトウェアの設計です。おかげでアプリケーションは見通しがよくなり、あとからの開発が楽になり、それぞれの部分を別々にテストできます。

Model-View-Presenter

Model-View-Controllerをもとにした設計です。

モジュール

モジュールはアプリケーションの論理的な部分を表します。ふつうの配置では、特定の機能の領域を受け持つプレゼンターとテンプレートのまとまりです。モジュールは Front/Admin/Shop/ のような別々のディレクトリに置かれます。

たとえばネットショップは次のように分けられます。

  • 商品を見て買うための表側(Shop/
  • 注文を管理するための顧客の区画(Customer/
  • 運営者のための管理画面(Admin/

技術的にはふつうのディレクトリですが、はっきりした構造のおかげでアプリケーションの規模を広げやすくなります。ですからプレゼンター Admin:Product:List は、たとえば app/Presentation/Admin/Product/List/ のディレクトリに置かれます(プレゼンターの対応づけをご覧ください)。

Namespace

名前空間は、バージョン 5.3 以降の PHP と、ほかのいくつかのプログラミング言語にある機能で、違うライブラリの同じ名前のクラスを名前の衝突なしに使えるようにします。PHP のドキュメントをご覧ください。

Presenter

プレゼンターは、HTTP のリクエストからルーターが読み解いたリクエストを受け取り、レスポンスを作るオブジェクトです。レスポンスは HTML のページ、画像、XML の文書、ディスクのファイル、JSON、リダイレクト、そのほかあなたが思いつくものなら何でもかまいません。

ふつうプレゼンターという語は Nette\Application\UI\Presenterクラスの子孫を指します。届いたリクエストをもとに、対応するアクションを実行し、テンプレートを描きます。

Router

HTTP のリクエストや URL と、プレゼンターのアクションとのあいだの双方向の翻訳器です。双方向とは、HTTP のリクエストからプレゼンターのアクションを導けて、逆にアクションから対応する URL を作れることです。詳しくは URL のルーティングの章をご覧ください。

SameSite クッキーは、ページの読み込みが何によって起きたかを見分けるしくみを与えます。値は 3 つで、LaxStrictNone です(最後のものには HTTPS が要ります)。ページへのリクエストがそのウェブサイト自身から来た場合、あるいは利用者がアドレス欄に直接打ち込んだりブックマークをクリックしたりしてページを開いた場合、ブラウザはすべてのクッキーをサーバーへ送ります(つまり LaxStrictNone のフラグの付いたものすべてです)。利用者がよそのサイトのリンクからそのウェブサイトへたどり着いた場合は、LaxNone のフラグの付いたクッキーがサーバーへ渡されます。リクエストがそれ以外のやり方、たとえばよそのサイトからの POST のフォームの送信、iframe の中での読み込み、JavaScript の利用などで起きた場合は、None のフラグの付いたクッキーだけが送られます。

サービス

Dependency Injection の文脈でのサービスは、DI コンテナが作って管理するオブジェクトを指します。サービスは、たとえばテストのためやアプリケーションの振る舞いを変えるために、それを使うコードに手を入れずに別の実装へ簡単に取り替えられます。

スニペット

スニペット、つまり AJAX のリクエストのときに独立して描き直せるページの一部です。

ビュー

ビューは、リクエストの結果を表示することを受け持つアプリケーションの層です。ふつうはテンプレートシステムを使い、特定のコンポーネントやモデルから得た結果をどう表示するかを知っています。