Browse Source

guide-ja revised [ci skip] (#16143)

* guide-ja/intro revised [ci skip]

* docs/guide-ja/start-* revised [ci skip]

* docs/guide-ja translation for "Active Record" revised [ci skip]

* docs/guide-ja/structure small fix [ci skip]

* docs/guide-ja/structure-models.md revised [ci skip]

* docs/guide-ja/structure-views.md reviewed [ci skip]

* guide-ja/structure-modules.md guide-ja/structure-filters.md revised [ci skip]

* guide-ja/structure-widgets.md updated [ci skip]

* guide-ja/structure revised [ci skip]

* guide-ja/structure-extensions.md revised [ci skip]

* guide-ja/structure-extensions.md revised [ci skip]

* guide-ja/intro adjusted line counts [ci skip]

* guide-ja/start adjusted line counts [ci skip]

* guide-ja/start line counts adjusted [ci skip]

* guide-ja/structure-extensions.md typo fixed [ci skip]

* guide-ja/structure line count adjusted [ci skip]

* guide-ja/structure line count adjusted [ci skip]
tags/2.0.16
Nobuo Kihara 7 years ago committed by Dmitry Naumenko
parent
commit
009682ca04
  1. 24
      docs/guide-ja/README.md
  2. 2
      docs/guide-ja/caching-data.md
  3. 4
      docs/guide-ja/concept-behaviors.md
  4. 2
      docs/guide-ja/concept-components.md
  5. 2
      docs/guide-ja/concept-configurations.md
  6. 2
      docs/guide-ja/concept-di-container.md
  7. 4
      docs/guide-ja/concept-events.md
  8. 212
      docs/guide-ja/db-active-record.md
  9. 6
      docs/guide-ja/db-dao.md
  10. 8
      docs/guide-ja/db-migrations.md
  11. 2
      docs/guide-ja/helper-array.md
  12. 4
      docs/guide-ja/input-forms.md
  13. 2
      docs/guide-ja/input-tabular-input.md
  14. 127
      docs/guide-ja/intro-upgrade-from-v1.md
  15. 20
      docs/guide-ja/intro-yii.md
  16. 6
      docs/guide-ja/output-data-providers.md
  17. 10
      docs/guide-ja/output-data-widgets.md
  18. 2
      docs/guide-ja/output-sorting.md
  19. 4
      docs/guide-ja/rest-controllers.md
  20. 4
      docs/guide-ja/rest-quick-start.md
  21. 2
      docs/guide-ja/rest-resources.md
  22. 2
      docs/guide-ja/runtime-bootstrapping.md
  23. 2
      docs/guide-ja/runtime-overview.md
  24. 4
      docs/guide-ja/security-authentication.md
  25. 2
      docs/guide-ja/security-authorization.md
  26. 2
      docs/guide-ja/security-best-practices.md
  27. 67
      docs/guide-ja/start-databases.md
  28. 46
      docs/guide-ja/start-forms.md
  29. 44
      docs/guide-ja/start-gii.md
  30. 37
      docs/guide-ja/start-hello.md
  31. 106
      docs/guide-ja/start-installation.md
  32. 4
      docs/guide-ja/start-looking-ahead.md
  33. 16
      docs/guide-ja/start-prerequisites.md
  34. 35
      docs/guide-ja/start-workflow.md
  35. 18
      docs/guide-ja/structure-application-components.md
  36. 148
      docs/guide-ja/structure-applications.md
  37. 211
      docs/guide-ja/structure-assets.md
  38. 101
      docs/guide-ja/structure-controllers.md
  39. 15
      docs/guide-ja/structure-entry-scripts.md
  40. 132
      docs/guide-ja/structure-extensions.md
  41. 64
      docs/guide-ja/structure-filters.md
  42. 107
      docs/guide-ja/structure-models.md
  43. 89
      docs/guide-ja/structure-modules.md
  44. 12
      docs/guide-ja/structure-overview.md
  45. 162
      docs/guide-ja/structure-views.md
  46. 28
      docs/guide-ja/structure-widgets.md
  47. 4
      docs/guide-ja/test-fixtures.md
  48. 10
      docs/guide-ja/tutorial-core-validators.md
  49. 10
      docs/guide-ja/tutorial-performance-tuning.md
  50. 2
      docs/guide-ja/tutorial-yii-as-micro-framework.md
  51. 6
      docs/guide-ja/tutorial-yii-integration.md

24
docs/guide-ja/README.md

@ -77,9 +77,9 @@ All Rights Reserved.
* [データベース・アクセス・オブジェクト](db-dao.md): データベースへの接続、基本的なクエリ、トランザクション、および、スキーマ操作
* [クエリ・ビルダ](db-query-builder.md): シンプルな抽象レイヤを使ってデータベースに対してクエリを行う
* [アクティブレコード](db-active-record.md): アクティブレコード ORM、レコードの読み出しと操作、リレーションの定義
* [アクティブレコード](db-active-record.md): アクティブレコード ORM、レコードの読み出しと操作、リレーションの定義
* [マイグレーション](db-migrations.md): チーム開発環境においてデータベースにバージョン・コントロールを適用
* [Sphinx](https://yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide)
* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide)
* [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide)
* [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide)
* [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide)
@ -130,8 +130,8 @@ All Rights Reserved.
* [HTTP キャッシュ](caching-http.md)
RESTful ウェブサービス
----------------------
RESTful ウェブサービス
------------------------
* [クイック・スタート](rest-quick-start.md)
* [リソース](rest-resources.md)
@ -182,14 +182,14 @@ RESTful ウェブサービス
ウィジェット
------------
* [GridView](http://www.yiiframework.com/doc-2.0/yii-grid-gridview.html)
* [ListView](http://www.yiiframework.com/doc-2.0/yii-widgets-listview.html)
* [DetailView](http://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html)
* [ActiveForm](http://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform)
* [Pjax](http://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html)
* [Menu](http://www.yiiframework.com/doc-2.0/yii-widgets-menu.html)
* [LinkPager](http://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html)
* [LinkSorter](http://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html)
* [[yii\grid\GridView|GridView]]
* [[yii\widgets\ListView|ListView]]
* [[yii\widgets\DetailView|DetailView]]
* [[yii\widgets\ActiveForm|ActiveForm]]
* [[yii\widgets\Pjax|Pjax]]
* [[yii\widgets\Menu|Menu]]
* [[yii\widgets\LinkPager|LinkPager]]
* [[yii\widgets\LinkSorter|LinkSorter]]
* [Bootstrap ウィジェット](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide)
* [jQuery UI ウィジェット](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide)

2
docs/guide-ja/caching-data.md

@ -267,7 +267,7 @@ $result = $db->cache(function ($db) {
});
```
クエリ・キャッシュは [DAO](db-dao.md) だけではなく [アクティブレコード](db-active-record.md) でも使用することができます。
クエリ・キャッシュは [DAO](db-dao.md) だけではなく [アクティブレコード](db-active-record.md) でも使用することができます。
```php
$result = Customer::getDb()->cache(function ($db) {

4
docs/guide-ja/concept-behaviors.md

@ -251,10 +251,10 @@ $component->detachBehaviors();
------------------------------
しめくくりに、[[yii\behaviors\TimestampBehavior]] を見てみましょう。このビヘイビアは、
`insert()`、`update()` または `save()` のメソッドを通じて [[yii\db\ActiveRecord|アクティブレコード]] モデルが保存されるときに、
`insert()`、`update()` または `save()` のメソッドを通じて [[yii\db\ActiveRecord|アクティブレコード]] モデルが保存されるときに、
タイムスタンプ属性の自動的な更新をサポートします。
まず、使用しようと考えている [[yii\db\ActiveRecord|アクティブレコード]] クラスに、このビヘイビアをアタッチします:
まず、使用しようと考えている [[yii\db\ActiveRecord|アクティブレコード]] クラスに、このビヘイビアをアタッチします:
```php
namespace app\models\User;

2
docs/guide-ja/concept-components.md

@ -80,7 +80,7 @@ $component = \Yii::createObject([
> Note: [[Yii::createObject()]] を呼び出すアプローチは複雑に見えますが、より強力です。というのも、それが [依存性注入コンテナ](concept-di-container.md) 上に実装されているからです。
[[yii\base\BaseObject]] クラスには、次のオブジェクト・ライフサイクルが適用されます:
[[yii\base\BaseObject]] クラスには、次のオブジェクト・ライフサイクルが適用されます:
1. コンストラクタ内の事前初期化。ここでデフォルトのプロパティ値を設定することができます。
2. `$config` によるオブジェクトの構成。構成情報は、コンストラクタ内で設定されたデフォルト値を上書きすることがあります。

2
docs/guide-ja/concept-configurations.md

@ -77,7 +77,7 @@ Yii::configure($object, $config);
## 構成情報を使用する <span id="using-configurations"></span>
構成情報は Yii の多くの場所で使用されています。このセクションの冒頭では、 [[Yii::createObject()]]
を使って、構成情報に応じてオブジェクトを作成する方法を示しました。このサブ・セクションでは、
を使って、構成情報に応じてオブジェクトを作成する方法を示しました。このでは、
アプリケーションの構成とウィジェットの構成という、2つの主要な構成情報の用途を説明します。

2
docs/guide-ja/concept-di-container.md

@ -41,7 +41,7 @@ $foo = new Foo($bar);
### メソッド・インジェクション <span id="method-injection"></span>
通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。
通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。
メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、大半のユースケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。
クラスのメソッドを次の例の `doSomething` メソッドのように定義することが出来ます。

4
docs/guide-ja/concept-events.md

@ -199,9 +199,9 @@ $foo->off(Foo::EVENT_HELLO);
イベントに応答したいことがあります。すべてのインスタンスにイベント・ハンドラをアタッチする代わりに、静的メソッド
[[yii\base\Event::on()]] を呼び出すことで、 *クラス・レベル* でハンドラをアタッチすることができます。
たとえば、[アクティブレコード](db-active-record.md) オブジェクトは、データベースに新しいレコードを挿入するたびに、
たとえば、[アクティブレコード](db-active-record.md) オブジェクトは、データベースに新しいレコードを挿入するたびに、
[[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] イベントをトリガします。 *すべての*
[アクティブレコード](db-active-record.md) オブジェクトによって行われる挿入を追跡するには、次のコードが使えます:
[アクティブレコード](db-active-record.md) オブジェクトによって行われる挿入を追跡するには、次のコードが使えます:
```php
use Yii;

212
docs/guide-ja/db-active-record.md

@ -1,12 +1,12 @@
アクティブレコード
==================
アクティブレコード
====================
[アクティブレコード](http://ja.wikipedia.org/wiki/Active_Record) は、データベースに保存されているデータにアクセスするために、オブジェクト指向のインタフェイスを提供するものです。
アクティブレコード・クラスはデータベース・テーブルと関連付けられます。
アクティブレコードのインスタンスはそのテーブルの行に対応し、アクティブレコードのインスタンスの *属性* がその行にある特定のカラムの値を表現します。
生の SQL 文を書く代りに、アクティブレコードの属性にアクセスしたり、アクティブレコードのメソッドを呼んだりして、データベース・テーブルに保存さているデータにアクセスしたり、データを操作したりします。
[アクティブレコード](http://ja.wikipedia.org/wiki/Active_Record) は、データベースに保存されているデータにアクセスするために、オブジェクト指向のインタフェイスを提供するものです。
アクティブレコード・クラスはデータベース・テーブルと関連付けられます。
アクティブレコードのインスタンスはそのテーブルの行に対応し、アクティブレコードのインスタンスの *属性* がその行にある特定のカラムの値を表現します。
生の SQL 文を書く代りに、アクティブレコードの属性にアクセスしたり、アクティブレコードのメソッドを呼んだりして、データベース・テーブルに保存さているデータにアクセスしたり、データを操作したりします。
例えば、`Customer` が `customer` テーブルに関連付けられたアクティブレコード・クラスであり、`name` が `customer` テーブルのカラムであると仮定しましょう。
例えば、`Customer` が `customer` テーブルに関連付けられたアクティブレコード・クラスであり、`name` が `customer` テーブルのカラムであると仮定しましょう。
`customer` テーブルに新しい行を挿入するために次のコードを書くことが出来ます。
```php
@ -24,7 +24,7 @@ $db->createCommand('INSERT INTO `customer` (`name`) VALUES (:name)', [
])->execute();
```
Yii は次のリレーショナル・データベースに対して、アクティブレコードのサポートを提供しています。
Yii は次のリレーショナル・データベースに対して、アクティブレコードのサポートを提供しています。
* MySQL 4.1 以降: [[yii\db\ActiveRecord]] による。
* PostgreSQL 7.3 以降: [[yii\db\ActiveRecord]] による。
@ -36,22 +36,22 @@ Yii は次のリレーショナル・データベースに対して、アクテ
* Sphinx: [[yii\sphinx\ActiveRecord]] による。`yii2-sphinx` エクステンションが必要。
* ElasticSearch: [[yii\elasticsearch\ActiveRecord]] による。`yii2-elasticsearch` エクステンションが必要。
これらに加えて、Yii は次の NoSQL データベースに対しても、アクティブレコードの使用をサポートしています。
これらに加えて、Yii は次の NoSQL データベースに対しても、アクティブレコードの使用をサポートしています。
* Redis 2.6.12 以降: [[yii\redis\ActiveRecord]] による。`yii2-redis` エクステンションが必要。
* MongoDB 1.3.0 以降: [[yii\mongodb\ActiveRecord]] による。`yii2-mongodb` エクステンションが必要。
このチュートリアルでは、主としてリレーショナル・データベースのためのアクティブレコードの使用方法を説明します。
しかし、ここで説明するほとんどの内容は NoSQL データベースのためのアクティブレコードにも適用することが出来るものです。
このチュートリアルでは、主としてリレーショナル・データベースのためのアクティブレコードの使用方法を説明します。
しかし、ここで説明するほとんどの内容は NoSQL データベースのためのアクティブレコードにも適用することが出来るものです。
## アクティブレコード・クラスを宣言する <span id="declaring-ar-classes"></span>
## アクティブレコード・クラスを宣言する <span id="declaring-ar-classes"></span>
まずは、[[yii\db\ActiveRecord]] を拡張してアクティブレコード・クラスを宣言するところから始めましょう。
まずは、[[yii\db\ActiveRecord]] を拡張してアクティブレコード・クラスを宣言するところから始めましょう。
### テーブル名を設定する
デフォルトでは、すべてのアクティブレコード・クラスはデータベース・テーブルと関連付けられます。
デフォルトでは、すべてのアクティブレコード・クラスはデータベース・テーブルと関連付けられます。
[[yii\db\ActiveRecord::tableName()|tableName()]] メソッドが、クラス名を [[yii\helpers\Inflector::camel2id()]] によって変換して、テーブル名を返します。
テーブル名がこの規約に従っていない場合は、このメソッドをオーバライドすることが出来ます。
@ -62,7 +62,7 @@ Yii は次のリレーショナル・データベースに対して、アクテ
例えば、`{{%post}}` は `{{tbl_post}}` となります。
テーブル名を囲む二重波括弧は、[テーブル名を囲む引用符号](db-dao.md#quoting-table-and-column-names) となります。
次の例では、`customer` というデータベース・テーブルのための `Customer` という名前のアクティブレコード・クラスを宣言しています。
次の例では、`customer` というデータベース・テーブルのための `Customer` という名前のアクティブレコード・クラスを宣言しています。
```php
namespace app\models;
@ -75,7 +75,7 @@ class Customer extends ActiveRecord
const STATUS_ACTIVE = 1;
/**
* @return string このアクティブレコード・クラスと関連付けられるテーブルの名前
* @return string このアクティブレコード・クラスと関連付けられるテーブルの名前
*/
public static function tableName()
{
@ -84,17 +84,17 @@ class Customer extends ActiveRecord
}
```
### アクティブレコードは「モデル」と呼ばれる
### アクティブレコードは「モデル」と呼ばれる
アクティブレコードのインスタンスは [モデル](structure-models.md) であると見なされます。
この理由により、私たちは通常 `app\models` 名前空間 (あるいはモデル・クラスを保管するための他の名前空間) の下にアクティブレコード・クラスを置きます。
アクティブレコードのインスタンスは [モデル](structure-models.md) であると見なされます。
この理由により、私たちは通常 `app\models` 名前空間 (あるいはモデル・クラスを保管するための他の名前空間) の下にアクティブレコード・クラスを置きます。
[[yii\db\ActiveRecord]] は [[yii\base\Model]] から拡張していますので、属性、検証規則、データのシリアル化など、[モデル](structure-models.md) が持つ *全ての* 機能を継承しています。
## データベースに接続する <span id="db-connection"></span>
デフォルトでは、アクティブレコードは、`db` [アプリケーション・コンポーネント](structure-application-components.md) を [[yii\db\Connection|DB 接続]] として使用して、データベースのデータにアクセスしたり操作したりします。
デフォルトでは、アクティブレコードは、`db` [アプリケーション・コンポーネント](structure-application-components.md) を [[yii\db\Connection|DB 接続]] として使用して、データベースのデータにアクセスしたり操作したりします。
[データベース・アクセス・オブジェクト](db-dao.md) で説明したように、次のようにして、アプリケーションの構成情報ファイルの中で `db` コンポーネントを構成することが出来ます。
```php
@ -127,12 +127,12 @@ class Customer extends ActiveRecord
## データをクエリする <span id="querying-data"></span>
アクティブレコード・クラスを宣言した後、それを使って対応するデータベース・テーブルからデータをクエリすることが出来ます。
アクティブレコード・クラスを宣言した後、それを使って対応するデータベース・テーブルからデータをクエリすることが出来ます。
このプロセスは通常次の三つのステップを踏みます。
1. [[yii\db\ActiveRecord::find()]] メソッドを呼んで、新しいクエリ・オブジェクトを作成する。
2. [クエリ構築メソッド](db-query-builder.md#building-queries) を呼んで、クエリ・オブジェクトを構築する。
3. [クエリ・メソッド](db-query-builder.md#query-methods) を呼んで、アクティブレコードのインスタンスの形でデータを取得する。
3. [クエリ・メソッド](db-query-builder.md#query-methods) を呼んで、アクティブレコードのインスタンスの形でデータを取得する。
ご覧のように、このプロセスは [クエリ・ビルダ](db-query-builder.md) による手続きと非常によく似ています。
唯一の違いは、`new` 演算子を使ってクエリ・オブジェクトを生成する代りに、[[yii\db\ActiveQuery]] クラスであるクエリ・オブジェクトを返す [[yii\db\ActiveRecord::find()]] を呼ぶ、という点です。
@ -173,8 +173,8 @@ $customers = Customer::find()
プライマリ・キーの値や一群のカラムの値でクエリをすることはよく行われる仕事ですので、Yii はこの目的のために、二つのショートカット・メソッドを提供しています。
- [[yii\db\ActiveRecord::findOne()]]: クエリ結果の最初の行を一つのアクティブレコード・インスタンスに投入して返す。
- [[yii\db\ActiveRecord::findAll()]]: *全ての* クエリ結果をアクティブレコード・インスタンスの配列に投入して返す。
- [[yii\db\ActiveRecord::findOne()]]: クエリ結果の最初の行を一つのアクティブレコード・インスタンスに投入して返す。
- [[yii\db\ActiveRecord::findAll()]]: *全ての* クエリ結果をアクティブレコード・インスタンスの配列に投入して返す。
どちらのメソッドも、次のパラメータ形式のどれかを取ることが出来ます。
@ -234,7 +234,7 @@ $customers = Customer::findAll([
あなたのクエリが多数のデータ行を返すかもしれない場合は、パフォーマンスを向上させるために、`limit(1)` を明示的に呼ぶべきです。
例えば `Customer::find()->limit(1)->one()` のように。
クエリ構築メソッドを使う以外に、生の SQL を書いてデータをクエリして結果をアクティブレコード・オブジェクトに投入することも出来ます。
クエリ構築メソッドを使う以外に、生の SQL を書いてデータをクエリして結果をアクティブレコード・オブジェクトに投入することも出来ます。
そうするためには [[yii\db\ActiveRecord::findBySql()]] メソッドを呼ぶことが出来ます。
```php
@ -247,9 +247,9 @@ $customers = Customer::findBySql($sql, [':status' => Customer::STATUS_INACTIVE])
## データにアクセスする <span id="accessing-data"></span>
既に述べたように、データベースから取得されたデータはアクティブレコードのインスタンスに投入されます。
そして、クエリ結果の各行がアクティブレコードの一つのインスタンスに対応します。
アクティブレコード・インスタンスの属性にアクセスすることによって、カラムの値にアクセスすることが出来ます。
既に述べたように、データベースから取得されたデータはアクティブレコードのインスタンスに投入されます。
そして、クエリ結果の各行がアクティブレコードの一つのインスタンスに対応します。
アクティブレコード・インスタンスの属性にアクセスすることによって、カラムの値にアクセスすることが出来ます。
例えば、
```php
@ -259,11 +259,11 @@ $id = $customer->id;
$email = $customer->email;
```
> Note: アクティブレコードの属性の名前は、関連付けられたテーブルのカラムの名前に従って、大文字と小文字を区別して名付けられます。
Yii は、関連付けられたテーブルの全てのカラムに対して、アクティブレコードの属性を自動的に定義します。
> Note: アクティブレコードの属性の名前は、関連付けられたテーブルのカラムの名前に従って、大文字と小文字を区別して名付けられます。
Yii は、関連付けられたテーブルの全てのカラムに対して、アクティブレコードの属性を自動的に定義します。
これらの属性は、すべて、再宣言してはいけません。
アクティブレコードの属性はテーブルのカラムに従って命名されるため、テーブルのカラム名がアンダースコアで単語を分ける方法で命名されている場合は、`$customer->first_name` のような属性名を使って PHP コードを書くことになります。
アクティブレコードの属性はテーブルのカラムに従って命名されるため、テーブルのカラム名がアンダースコアで単語を分ける方法で命名されている場合は、`$customer->first_name` のような属性名を使って PHP コードを書くことになります。
コード・スタイルの一貫性が気になるのであれば、テーブルのカラム名を (例えば camelCase を使う名前に) 変更しなければなりません。
@ -271,7 +271,7 @@ $email = $customer->email;
入力または表示されるデータの形式が、データベースにデータを保存するときに使われるものと異なる場合がよくあります。
例えば、データベースでは顧客の誕生日を UNIX タイムスタンプで保存している (まあ、あまり良い設計ではありませんが) けれども、ほとんどの場合において誕生日を `'YYYY/MM/DD'` という形式の文字列として操作したい、というような場合です。
この目的を達するために、次のように、`Customer` アクティブレコード・クラスにおいて *データ変換* メソッドを定義することが出来ます。
この目的を達するために、次のように、`Customer` アクティブレコード・クラスにおいて *データ変換* メソッドを定義することが出来ます。
```php
class Customer extends ActiveRecord
@ -299,7 +299,7 @@ class Customer extends ActiveRecord
### データを配列に取得する <span id="data-in-arrays"></span>
データをアクティブレコード・オブジェクトの形で取得するのは便利であり柔軟ですが、大きなメモリ使用量を要するために、大量のデータを取得しなければならない場合は、必ずしも望ましい方法ではありません。
データをアクティブレコード・オブジェクトの形で取得するのは便利であり柔軟ですが、大きなメモリ使用量を要するために、大量のデータを取得しなければならない場合は、必ずしも望ましい方法ではありません。
そういう場合は、クエリ・メソッドを実行する前に [[yii\db\ActiveQuery::asArray()|asArray()]] を呼ぶことによって、PHP 配列を使ってデータを取得することが出来ます。
```php
@ -310,9 +310,9 @@ $customers = Customer::find()
->all();
```
> Note: このメソッドはメモリを節約してパフォーマンスを向上させますが、低レベルの DB 抽象レイヤに近いものであり、あなたはアクティブレコードの機能のほとんどを失うことになります。
> Note: このメソッドはメモリを節約してパフォーマンスを向上させますが、低レベルの DB 抽象レイヤに近いものであり、あなたはアクティブレコードの機能のほとんどを失うことになります。
非常に重要な違いが、カラムの値のデータ型に現れます。
アクティブレコード・インスタンスとしてデータを返す場合、カラムの値は実際のカラムの型に従って自動的に型キャストされます。
アクティブレコード・インスタンスとしてデータを返す場合、カラムの値は実際のカラムの型に従って自動的に型キャストされます。
一方、配列としてデータを返す場合は、実際のカラムの型に関係なく、カラムの値は文字列になります。
なぜなら、何も処理をしない場合の PDO の結果は文字列だからです。
@ -320,7 +320,7 @@ $customers = Customer::find()
### データをバッチ・モードで取得する <span id="data-in-batches"></span>
[クエリ・ビルダ](db-query-builder.md) において、大量のデータをデータベースから検索する場合に、メモリ使用量を最小化するために *バッチ・クエリ* を使うことが出来るということを説明しました。
おなじテクニックをアクティブレコードでも使うことが出来ます。
おなじテクニックをアクティブレコードでも使うことが出来ます。
例えば、
```php
@ -341,10 +341,10 @@ foreach (Customer::find()->with('orders')->each() as $customer) {
## データを保存する <span id="inserting-updating-data"></span>
アクティブレコードを使えば、次のステップを踏んで簡単にデータをデータベースに保存することが出来ます。
アクティブレコードを使えば、次のステップを踏んで簡単にデータをデータベースに保存することが出来ます。
1. アクティブレコードのインスタンスを準備する
2. アクティブレコードの属性に新しい値を割り当てる
1. アクティブレコードのインスタンスを準備する
2. アクティブレコードの属性に新しい値を割り当てる
3. [[yii\db\ActiveRecord::save()]] を呼んでデータをデータベースに保存する
例えば、
@ -361,11 +361,11 @@ $customer->email = 'james@newexample.com';
$customer->save();
```
[[yii\db\ActiveRecord::save()|save()]] メソッドは、アクティブレコード・インスタンスの状態に従って、データ行を挿入するか、または、更新することが出来ます。
[[yii\db\ActiveRecord::save()|save()]] メソッドは、アクティブレコード・インスタンスの状態に従って、データ行を挿入するか、または、更新することが出来ます。
インスタンスが `new` 演算子によって新しく作成されたものである場合は、[[yii\db\ActiveRecord::save()|save()]] を呼び出すと、新しい行が挿入されます。
インスタンスがクエリ・メソッドの結果である場合は、[[yii\db\ActiveRecord::save()|save()]] を呼び出すと、そのインスタンスと関連付けられた行が更新されます。
アクティブレコード・インスタンスの二つの状態は、その [[yii\db\ActiveRecord::isNewRecord|isNewRecord]] プロパティの値をチェックすることによって区別することが出来ます。
アクティブレコード・インスタンスの二つの状態は、その [[yii\db\ActiveRecord::isNewRecord|isNewRecord]] プロパティの値をチェックすることによって区別することが出来ます。
下記のように、このプロパティは [[yii\db\ActiveRecord::save()|save()]] によっても内部的に使用されています。
```php
@ -396,8 +396,8 @@ public function save($runValidation = true, $attributeNames = null)
### 一括代入 <span id="massive-assignment"></span>
通常の [モデル](structure-models.md) と同じように、アクティブレコードのインスタンスも [一括代入機能](structure-models.md#massive-assignment) を享受することが出来ます。
この機能を使うと、下記で示されているように、一つの PHP 文で、アクティブレコード・インスタンスの複数の属性に値を割り当てることが出来ます。
通常の [モデル](structure-models.md) と同じように、アクティブレコードのインスタンスも [一括代入機能](structure-models.md#massive-assignment) を享受することが出来ます。
この機能を使うと、下記で示されているように、一つの PHP 文で、アクティブレコード・インスタンスの複数の属性に値を割り当てることが出来ます。
ただし、[安全な属性](structure-models.md#safe-attributes) だけが一括代入が可能であることを記憶しておいてください。
```php
@ -433,11 +433,11 @@ $post->updateCounters(['view_count' => 1]);
### ダーティな属性 <span id="dirty-attributes"></span>
[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブレコード・インスタンスを保存すると、*ダーティな属性* だけが保存されます。
[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブレコード・インスタンスを保存すると、*ダーティな属性* だけが保存されます。
属性は、DB からロードされた後、または、最後に保存された後にその値が変更されると、*ダーティ* であると見なされます。
ただし、データ検証は、アクティブレコード・インスタンスがダーティな属性を持っているかどうかに関係なく実施されることに注意してください。
ただし、データ検証は、アクティブレコード・インスタンスがダーティな属性を持っているかどうかに関係なく実施されることに注意してください。
アクティブレコードはダーティな属性のリストを自動的に保守します。
アクティブレコードはダーティな属性のリストを自動的に保守します。
そうするために、一つ前のバージョンの属性値を保持して、最新のバージョンと比較します。
[[yii\db\ActiveRecord::getDirtyAttributes()]] を呼ぶと、現在ダーティである属性を取得することが出来ます。
また、[[yii\db\ActiveRecord::markAttributeDirty()]] を呼んで、ある属性をダーティであると明示的にマークすることも出来ます。
@ -454,8 +454,8 @@ $post->updateCounters(['view_count' => 1]);
### デフォルト属性値 <span id="default-attribute-values"></span>
あなたのテーブルのカラムの中には、データベースでデフォルト値が定義されているものがあるかも知れません。
そして、場合によっては、アクティブレコード・インスタンスのウェブ・フォームに、そういうデフォルト値をあらかじめ投入したいことがあるでしょう。
同じデフォルト値を繰り返して書くことを避けるために、[[yii\db\ActiveRecord::loadDefaultValues()|loadDefaultValues()]] を呼んで、DB で定義されたデフォルト値を対応するアクティブレコードの属性に投入することが出来ます。
そして、場合によっては、アクティブレコード・インスタンスのウェブ・フォームに、そういうデフォルト値をあらかじめ投入したいことがあるでしょう。
同じデフォルト値を繰り返して書くことを避けるために、[[yii\db\ActiveRecord::loadDefaultValues()|loadDefaultValues()]] を呼んで、DB で定義されたデフォルト値を対応するアクティブレコードの属性に投入することが出来ます。
```php
$customer = new Customer();
@ -468,7 +468,7 @@ $customer->loadDefaultValues();
[[yii\db\ActiveRecord]] は、クエリの結果を投入されるときに、[データベース・テーブル・スキーマ](db-dao.md#database-schema)
からの情報を使って、自動的な型キャストを実行します。これによって、整数として宣言されているテーブルカラムから取得されるデータを
アクティブレコードのインスタンスでも PHP の integer として投入し、
アクティブレコードのインスタンスでも PHP の integer として投入し、
真偽値として宣言されているデータを boolean として投入することが出来るようになっています。
しかしながら、型キャストのメカニズムには、いくつかの制約があります。
@ -477,22 +477,22 @@ $customer->loadDefaultValues();
'unsigned integer' または 'big integer' として宣言されたカラムの値は、64-bit オペレーティングシステムでのみ PHP の integer に変換されます。
32-bit オペレーティングシステムでは、文字列として表されます。
属性の型キャストは、アクティブレコードのインスタンスにクエリの結果から値を投入するときだけしか実行されないことに注意してください。
属性の型キャストは、アクティブレコードのインスタンスにクエリの結果から値を投入するときだけしか実行されないことに注意してください。
HTTP リクエストから値をロードしたり、プロパティにアクセスして直接に値を設定したりするときには、自動的な変換は行われません。
また、アクティブレコードのデータ保存のための SQL 文を準備する際にもテーブル・スキーマが使用されて、値が正しい型でクエリにバインドされることを保証します。
しかし、アクティブレコードのインスタンスの属性値は保存の過程において変換されることはありません。
また、アクティブレコードのデータ保存のための SQL 文を準備する際にもテーブル・スキーマが使用されて、値が正しい型でクエリにバインドされることを保証します。
しかし、アクティブレコードのインスタンスの属性値は保存の過程において変換されることはありません。
> Tip: アクティブレコードの検証や保存の際の属性型キャストを楽にするために
> Tip: アクティブレコードの検証や保存の際の属性型キャストを楽にするために
[[yii\behaviors\AttributeTypecastBehavior]] を使うことが出来ます。
2.0.14 以降、Yii のアクティブレコードは、JSON や多次元配列のような複雑な型をサポートしています。
2.0.14 以降、Yii のアクティブレコードは、JSON や多次元配列のような複雑な型をサポートしています。
#### MySQL および PostgreSQL における JSON
データが取得された後、JSON カラムの値は標準的な JSON デコード規則に従って、
自動的に JSON からデコードされます。
アクティブレコードは、属性値を JSON カラムに保存するために [[yii\db\JsonExpression|JsonExpression]]
アクティブレコードは、属性値を JSON カラムに保存するために [[yii\db\JsonExpression|JsonExpression]]
オブジェクトを自動的に生成します。このオブジェクトが [クエリ・ビルダ](db-query-builder.md) レベルで JSON 文字列にエンコードされます。
#### PostgreSQL における配列
@ -501,7 +501,7 @@ HTTP リクエストから値をロードしたり、プロパティにアクセ
このオブジェクトは PHP の `ArrayAccess` インタフェイスを実装しているため、これを配列として使うこと事が出来ます。
また、`->getValue()` を呼んで配列そのものを取得することも出来ます。
アクティブレコードは、属性値を配列カラムに保存するために [[yii\db\ArrayExpression|ArrayExpression]]
アクティブレコードは、属性値を配列カラムに保存するために [[yii\db\ArrayExpression|ArrayExpression]]
オブジェクトを生成します。このオブジェクトが [クエリ・ビルダ](db-query-builder.md) のレベルで配列を表す PgSQL 文字列にエンコードされます。
JSON カラムに対して条件を使用することも出来ます。
@ -515,7 +515,7 @@ $query->andWhere(['=', 'json', new ArrayExpression(['foo' => 'bar'])
### 複数の行を更新する <span id="updating-multiple-rows"></span>
上述のメソッドは、すべて、個別のアクティブレコード・インスタンスに対して作用し、個別のテーブル行を挿入したり更新したりするものです。
上述のメソッドは、すべて、個別のアクティブレコード・インスタンスに対して作用し、個別のテーブル行を挿入したり更新したりするものです。
複数の行を同時に更新するためには、代りに、スタティックなメソッドである [[yii\db\ActiveRecord::updateAll()|updateAll()]] を呼ばなければなりません。
```php
@ -533,7 +533,7 @@ Customer::updateAllCounters(['age' => 1]);
## データを削除する <span id="deleting-data"></span>
一行のデータを削除するためには、最初にその行に対応するアクティブレコード・インスタンスを取得して、次に [[yii\db\ActiveRecord::delete()]] メソッドを呼びます。
一行のデータを削除するためには、最初にその行に対応するアクティブレコード・インスタンスを取得して、次に [[yii\db\ActiveRecord::delete()]] メソッドを呼びます。
```php
$customer = Customer::findOne(123);
@ -550,37 +550,37 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]);
なぜなら、条件の指定を間違うと、あなたのテーブルからすべてのデータを完全に消し去ってしまうことになるからです。
## アクティブレコードのライフサイクル <span id="ar-life-cycles"></span>
## アクティブレコードのライフサイクル <span id="ar-life-cycles"></span>
アクティブレコードがさまざまな目的で使用される場合のそれぞれのライフサイクルを理解しておくことは重要なことです。
それぞれのライフサイクルにおいては、特定の一続きのメソッドが呼び出されます。
そして、これらのメソッドをオーバーライドして、ライフサイクルをカスタマイズするチャンスを得ることが出来ます。
また、ライフサイクルの中でトリガされる特定のアクティブレコード・イベントに反応して、あなたのカスタム・コードを挿入することも出来ます。
これらのイベントが特に役に立つのは、アクティブレコードのライフサイクルをカスタマイズする必要のあるアクティブレコード・[ビヘイビア](concept-behaviors.md) を開発する際です。
アクティブレコードがさまざまな目的で使用される場合のそれぞれのライフサイクルを理解しておくことは重要なことです。
それぞれのライフサイクルにおいては、特定の一続きのメソッドが呼び出されます。
そして、これらのメソッドをオーバーライドして、ライフサイクルをカスタマイズするチャンスを得ることが出来ます。
また、ライフサイクルの中でトリガされる特定のアクティブレコード・イベントに反応して、あなたのカスタム・コードを挿入することも出来ます。
これらのイベントが特に役に立つのは、アクティブレコードのライフサイクルをカスタマイズする必要のあるアクティブレコード・[ビヘイビア](concept-behaviors.md) を開発する際です。
次に、さまざまなアクティブレコードのライフサイクルと、そのライフサイクルに含まれるメソッドやイベントを要約します。
次に、さまざまなアクティブレコードのライフサイクルと、そのライフサイクルに含まれるメソッドやイベントを要約します。
### 新しいインスタンスのライフサイクル <span id="new-instance-life-cycle"></span>
### 新しいインスタンスのライフサイクル <span id="new-instance-life-cycle"></span>
`new` 演算子によって新しいアクティブレコード・インスタンスを作成する場合は、次のライフサイクルを経ます。
`new` 演算子によって新しいアクティブレコード・インスタンスを作成する場合は、次のライフサイクルを経ます。
1. クラスのコンストラクタ。
2. [[yii\db\ActiveRecord::init()|init()]]: [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] イベントをトリガ。
### データをクエリする際のライフサイクル <span id="querying-data-life-cycle"></span>
### データをクエリする際のライフサイクル <span id="querying-data-life-cycle"></span>
[クエリ・メソッド](#querying-data) のどれか一つによってデータをクエリする場合は、新しくデータを投入されるアクティブレコードは次のライフサイクルを経ます。
[クエリ・メソッド](#querying-data) のどれか一つによってデータをクエリする場合は、新しくデータを投入されるアクティブレコードは次のライフサイクルを経ます。
1. クラスのコンストラクタ。
2. [[yii\db\ActiveRecord::init()|init()]]: [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] イベントをトリガ。
3. [[yii\db\ActiveRecord::afterFind()|afterFind()]]: [[yii\db\ActiveRecord::EVENT_AFTER_FIND|EVENT_AFTER_FIND]] イベントをトリガ。
### データを保存する際のライフサイクル <span id="saving-data-life-cycle"></span>
### データを保存する際のライフサイクル <span id="saving-data-life-cycle"></span>
[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブレコード・インスタンスを挿入または更新する場合は、次のライフサイクルを経ます。
[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブレコード・インスタンスを挿入または更新する場合は、次のライフサイクルを経ます。
1. [[yii\db\ActiveRecord::beforeValidate()|beforeValidate()]]: [[yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE|EVENT_BEFORE_VALIDATE]] イベントをトリガ。
このメソッドが `false` を返すか、[[yii\base\ModelEvent::isValid]] が `false` であった場合、残りのステップはスキップされる。
@ -592,9 +592,9 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]);
6. [[yii\db\ActiveRecord::afterSave()|afterSave()]]: [[yii\db\ActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] または [[yii\db\ActiveRecord::EVENT_AFTER_UPDATE|EVENT_AFTER_UPDATE]] イベントをトリガ。
### データを削除する際のライフサイクル <span id="deleting-data-life-cycle"></span>
### データを削除する際のライフサイクル <span id="deleting-data-life-cycle"></span>
[[yii\db\ActiveRecord::delete()|delete()]] を呼んでアクティブレコード・インスタンスを削除する際は、次のライフサイクルを経ます。
[[yii\db\ActiveRecord::delete()|delete()]] を呼んでアクティブレコード・インスタンスを削除する際は、次のライフサイクルを経ます。
1. [[yii\db\ActiveRecord::beforeDelete()|beforeDelete()]]: [[yii\db\ActiveRecord::EVENT_BEFORE_DELETE|EVENT_BEFORE_DELETE]] イベントをトリガ。
このメソッドが `false` を返すか、[[yii\base\ModelEvent::isValid]] が `false` であった場合は、残りのステップはスキップされる。
@ -602,7 +602,7 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]);
3. [[yii\db\ActiveRecord::afterDelete()|afterDelete()]]: [[yii\db\ActiveRecord::EVENT_AFTER_DELETE|EVENT_AFTER_DELETE]] イベントをトリガ。
> Note: 次のメソッドを呼んだ場合は、いずれの場合も、上記のライフサイクルのどれかを開始させることはありません。
> Note: 次のメソッドを呼んだ場合は、いずれの場合も、上記のライフサイクルのどれかを開始させることはありません。
> これらのメソッドは、レコード単位ではなく、データベース上で直接に動作するためです。
>
> - [[yii\db\ActiveRecord::updateAll()]]
@ -610,17 +610,17 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]);
> - [[yii\db\ActiveRecord::updateCounters()]]
> - [[yii\db\ActiveRecord::updateAllCounters()]]
### データをリフレッシュする際のライフサイクル <span id="refreshing-data-life-cycle"></span>
### データをリフレッシュする際のライフサイクル <span id="refreshing-data-life-cycle"></span>
[[yii\db\ActiveRecord::refresh()|refresh()]] を呼んでアクティブレコード・インスタンスをリフレッシュする際は、リフレッシュが成功してメソッドが `true` を返すと
[[yii\db\ActiveRecord::refresh()|refresh()]] を呼んでアクティブレコード・インスタンスをリフレッシュする際は、リフレッシュが成功してメソッドが `true` を返すと
[[yii\db\ActiveRecord::EVENT_AFTER_REFRESH|EVENT_AFTER_REFRESH]] イベントがトリガされます。
## トランザクションを扱う <span id="transactional-operations"></span>
アクティブレコードを扱う際には、二つの方法で [トランザクション](db-dao.md#performing-transactions) を処理することができます。
アクティブレコードを扱う際には、二つの方法で [トランザクション](db-dao.md#performing-transactions) を処理することができます。
最初の方法は、次に示すように、アクティブレコードのメソッドの呼び出しを明示的にトランザクションのブロックで囲む方法です。
最初の方法は、次に示すように、アクティブレコードのメソッドの呼び出しを明示的にトランザクションのブロックで囲む方法です。
```php
$customer = Customer::findOne(123);
@ -696,12 +696,12 @@ class Post extends \yii\db\ActiveRecord
楽観的ロックを使用するためには、次のようにします。
1. アクティブレコード・クラスと関連付けられている DB テーブルに、各行のバージョン番号を保存するカラムを作成します。
1. アクティブレコード・クラスと関連付けられている DB テーブルに、各行のバージョン番号を保存するカラムを作成します。
カラムは長倍精度整数 (big integer) タイプでなければなりません (MySQL では `BIGINT DEFAULT 0` です)。
2. [[yii\db\ActiveRecord::optimisticLock()]] メソッドをオーバーライドして、このカラムの名前を返すようにします。
3. ユーザ入力を収集するウェブフォームに、更新されるレコードの現在のバージョン番号を保持する隠しフィールドを追加します。
バージョン属性が入力の検証規則を持っており、検証が成功することを確かめてください。
4. アクティブレコードを使って行の更新を行うコントローラ・アクションにおいて、[[\yii\db\StaleObjectException]] 例外を捕捉して、衝突を解決するために必要なビジネス・ロジック (例えば、変更をマージしたり、データの陳腐化を知らせたり) を実装します。
4. アクティブレコードを使って行の更新を行うコントローラ・アクションにおいて、[[\yii\db\StaleObjectException]] 例外を捕捉して、衝突を解決するために必要なビジネス・ロジック (例えば、変更をマージしたり、データの陳腐化を知らせたり) を実装します。
例えば、バージョン番号のカラムが `version` と名付けられているとすると、次のようなコードによって楽観的ロックを実装することが出来ます。
@ -739,15 +739,15 @@ public function actionUpdate($id)
## リレーショナル・データを扱う <span id="relational-data"></span>
個々のデータベース・テーブルを扱うだけでなく、アクティブレコードは関連したテーブルのデータも一緒に読み出して、主たるデータを通して簡単にアクセス出来るようにすることが出来ます。
個々のデータベース・テーブルを扱うだけでなく、アクティブレコードは関連したテーブルのデータも一緒に読み出して、主たるデータを通して簡単にアクセス出来るようにすることが出来ます。
例えば、一人の顧客は一つまたは複数の注文を発することがあり得ますので、顧客のデータは注文のデータと関連を持っていることになります。
このリレーションが適切に宣言されていれば、`$customer->orders` という式を使って顧客の注文情報にアクセスすることが出来ます。
`$customer->orders` は、顧客の注文情報を `Order` アクティブレコード・インスタンスの配列として返してくれます。
`$customer->orders` は、顧客の注文情報を `Order` アクティブレコード・インスタンスの配列として返してくれます。
### リレーションを宣言する <span id="declaring-relations"></span>
アクティブレコードを使ってリレーショナル・データを扱うためには、最初に、アクティブレコード・クラスの中でリレーションを宣言する必要があります。
アクティブレコードを使ってリレーショナル・データを扱うためには、最初に、アクティブレコード・クラスの中でリレーションを宣言する必要があります。
これは、以下のように、関心のあるそれぞれのリレーションについて *リレーション・メソッド* を宣言するだけの簡単な作業です。
```php
@ -782,11 +782,11 @@ class Order extends ActiveRecord
- リレーションの多重性: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]] のどちらかを呼ぶことによって指定されます。
上記の例では、リレーションの宣言において、顧客は複数の注文を持ち得るが、一方、注文は一人の顧客しか持たない、ということが容易に読み取れます。
- 関連するアクティブレコード・クラスの名前: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]] の最初のパラメータとして指定されます。
- 関連するアクティブレコード・クラスの名前: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]] の最初のパラメータとして指定されます。
クラス名を取得するのに `Xyz::className()` を呼ぶのが推奨されるプラクティスです。
そうすれば、IDE の自動補完のサポートを得ることことが出来るだけでなく、コンパイル段階でエラーを検出することが出来ます。
- 二つのデータタイプ間のリンク: 二つのデータタイプの関連付けに用いられるカラムを指定します。
配列の値は主たるデータ (リレーションを宣言しているアクティブレコード・クラスによって表されるデータ) のカラムであり、配列のキーは関連するデータのカラムです。
配列の値は主たるデータ (リレーションを宣言しているアクティブレコード・クラスによって表されるデータ) のカラムであり、配列のキーは関連するデータのカラムです。
### リレーショナル・データにアクセスする <span id="accessing-relational-data"></span>
@ -808,8 +808,8 @@ $orders = $customer->orders;
> Info: `xyz` という名前のリレーションを getter メソッド `getXyz()` によって宣言すると、`xyz` を [オブジェクト・プロパティ](concept-properties.md) のようにアクセスすることが出来るようになります。
名前は大文字と小文字を区別することに注意してください。
リレーションが [[yii\db\ActiveRecord::hasMany()|hasMany()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブレコード・インスタンスの配列が返されます。
リレーションが [[yii\db\ActiveRecord::hasOne()|hasOne()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブレコード・インスタンスか、関連付けられたデータが見つからないときは `null` が返されます。
リレーションが [[yii\db\ActiveRecord::hasMany()|hasMany()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブレコード・インスタンスの配列が返されます。
リレーションが [[yii\db\ActiveRecord::hasOne()|hasOne()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブレコード・インスタンスか、関連付けられたデータが見つからないときは `null` が返されます。
リレーション・プロパティに最初にアクセスしたときは、上記の例で示されているように、SQL 文が実行されます。
その同じプロパティに再びアクセスしたときは、SQL 文を再実行することなく、以前の結果が返されます。
@ -960,7 +960,7 @@ class Customer extends ActiveRecord
### レイジー・ローディングとイーガー・ローディング <span id="lazy-eager-loading"></span>
[リレーショナル・データにアクセスする](#accessing-relational-data) において、通常のオブジェクト・プロパティにアクセスするのと同じようにして、アクティブレコード・インスタンスのリレーション・プロパティにアクセスすることが出来ることを説明しました。
[リレーショナル・データにアクセスする](#accessing-relational-data) において、通常のオブジェクト・プロパティにアクセスするのと同じようにして、アクティブレコード・インスタンスのリレーション・プロパティにアクセスすることが出来ることを説明しました。
SQL 文は、リレーション・プロパティに最初にアクセスするときにだけ実行されます。
このようなリレーショナル・データのアクセス方法を *レイジー・ローディング* と呼びます。
例えば、
@ -977,7 +977,7 @@ $orders2 = $customer->orders;
```
レイジー・ローディングは非常に使い勝手が良いものです。
しかし、複数のアクティブレコード・インスタンスの同じリレーション・プロパティにアクセスする必要がある場合は、パフォーマンスの問題を生じ得ます。
しかし、複数のアクティブレコード・インスタンスの同じリレーション・プロパティにアクセスする必要がある場合は、パフォーマンスの問題を生じ得ます。
次のコードサンプルを考えて見てください。実行される SQL 文の数はいくらになるでしょう?
```php
@ -1009,12 +1009,12 @@ foreach ($customers as $customer) {
}
```
[[yii\db\ActiveQuery::with()]] を呼ぶことによって、最初の 100 人の顧客の注文をたった一つの SQL 文で返すように、アクティブレコードに指示をしています。
[[yii\db\ActiveQuery::with()]] を呼ぶことによって、最初の 100 人の顧客の注文をたった一つの SQL 文で返すように、アクティブレコードに指示をしています。
結果として、実行される SQL 文の数は 101 から 2 に減ります。
イーガー・ローディングは、一つだけでなく、複数のリレーションに対しても使うことが出来ます。
さらには、*ネストされたリレーション* でさえ、イーガー・ロードすることが出来ます。
ネストされたリレーションというのは、関連するアクティブレコードの中で宣言されているリレーションです。
ネストされたリレーションというのは、関連するアクティブレコードの中で宣言されているリレーションです。
例えば、`Cutomer` が `orders` リレーションによって `Order` と関連しており、`Order` が `items` リレーションによって `Item` と関連している場合です。
`Customer` に対するクエリを実行するときに、ネストされたリレーションの記法である `orders.items` を使って、`items` をイーガー・ロードすることが出来ます。
@ -1196,7 +1196,7 @@ $query->joinWith(['orders o' => function($q) {
### 逆リレーション <span id="inverse-relations"></span>
リレーションの宣言は、たいていの場合、二つのアクティブレコード・クラスの間で相互的なものになります。
リレーションの宣言は、たいていの場合、二つのアクティブレコード・クラスの間で相互的なものになります。
例えば、`Customer` は `orders` リレーションによって `Order` に関連付けられ、逆に、`Order` は`customer` リレーションによって `Customer` に関連付けられる、という具合です。
```php
@ -1263,7 +1263,7 @@ echo $customer2 === $customer ? '同じ' : '異なる';
リレーショナル・データを扱う時には、たいてい、さまざまなデータ間にリレーションを確立したり、既存のリレーションを破棄したりする必要があります。
そのためには、リレーションを定義するカラムの値を適切に設定することが必要です。
アクティブレコードを使う場合は、結局の所、次のようなコードを書くことになるでしょう。
アクティブレコードを使う場合は、結局の所、次のようなコードを書くことになるでしょう。
```php
$customer = Customer::findOne(123);
@ -1276,7 +1276,7 @@ $order->customer_id = $customer->id;
$order->save();
```
アクティブレコードは、この仕事をもっと楽に達成することが出来るように、[[yii\db\ActiveRecord::link()|link()]] メソッドを提供しています。
アクティブレコードは、この仕事をもっと楽に達成することが出来るように、[[yii\db\ActiveRecord::link()|link()]] メソッドを提供しています。
```php
$customer = Customer::findOne(123);
@ -1287,11 +1287,11 @@ $order->subtotal = 100;
$order->link('customer', $customer);
```
[[yii\db\ActiveRecord::link()|link()]] メソッドは、リレーション名と、リレーションを確立する対象のアクティブレコード・インスタンスを指定することを要求します。
このメソッドは、二つのアクティブレコード・インスタンスをリンクする属性の値を修正して、それをデータベースに書き込みます。
[[yii\db\ActiveRecord::link()|link()]] メソッドは、リレーション名と、リレーションを確立する対象のアクティブレコード・インスタンスを指定することを要求します。
このメソッドは、二つのアクティブレコード・インスタンスをリンクする属性の値を修正して、それをデータベースに書き込みます。
上記の例では、`Order` インスタンスの `customer_id` 属性を `Customer` インスタンスの `id` 属性の値になるようにセットして、それをデータベースに保存します。
> Note: 二つの新規作成されたアクティブレコード・インスタンスをリンクすることは出来ません。
> Note: 二つの新規作成されたアクティブレコード・インスタンスをリンクすることは出来ません。
[[yii\db\ActiveRecord::link()|link()]] を使用することの利点は、リレーションが [中間テーブル](#junction-table) によって定義されている場合に、さらに明白になります。
例えば、一つの `Order` インスタンスと一つの`Item` インスタンスをリンクするのに、次のコードを使うことが出来ます。
@ -1302,11 +1302,11 @@ $order->link('items', $item);
上記のコードによって、`order_item` 中間テーブルに、注文と商品を関連付けるための行が自動的に挿入されます。
> Info: [[yii\db\ActiveRecord::link()|link()]] メソッドは、影響を受けるアクティブレコード・インスタンスを保存する際に、データ検証を実行しません。
> Info: [[yii\db\ActiveRecord::link()|link()]] メソッドは、影響を受けるアクティブレコード・インスタンスを保存する際に、データ検証を実行しません。
このメソッドを呼ぶ前にすべての入力値を検証することはあなたの責任です。
[[yii\db\ActiveRecord::link()|link()]] の逆の操作が [[yii\db\ActiveRecord::unlink()|unlink()]] です。
これは、既存の二つのアクティブレコード・インスタンスのリレーションを破棄します。
これは、既存の二つのアクティブレコード・インスタンスのリレーションを破棄します。
例えば、
```php
@ -1322,7 +1322,7 @@ $customer->unlink('orders', $customer->orders[0]);
## DBMS 間のリレーション <span id="cross-database-relations"></span>
アクティブレコードは、異なるデータベースをバックエンドに持つアクティブレコードの間でリレーションを宣言することを可能にしています。
アクティブレコードは、異なるデータベースをバックエンドに持つアクティブレコードの間でリレーションを宣言することを可能にしています。
データベースは異なるタイプ (例えば、MySQL と PostgreSQL、または、MS SQL と MongoDB) であってもよく、別のサーバで動作していても構いません。
同じ構文を使ってリレーショナル・クエリを実行することが出来ます。
例えば、
@ -1370,8 +1370,8 @@ $customers = Customer::find()->with('comments')->all();
## クエリ・クラスをカスタマイズする <span id="customizing-query-classes"></span>
デフォルトでは、全てのアクティブレコードのクエリは [[yii\db\ActiveQuery]] によってサポートされます。
カスタマイズされたクエリ・クラスをアクティブレコードで使用するためには、[[yii\db\ActiveRecord::find()]] メソッドをオーバーライドして、カスタマイズされたクエリ・クラスのインスタンスを返すようにしなければなりません。
デフォルトでは、全てのアクティブレコードのクエリは [[yii\db\ActiveQuery]] によってサポートされます。
カスタマイズされたクエリ・クラスをアクティブレコードで使用するためには、[[yii\db\ActiveRecord::find()]] メソッドをオーバーライドして、カスタマイズされたクエリ・クラスのインスタンスを返すようにしなければなりません。
例えば、
```php
@ -1431,7 +1431,7 @@ $inactiveComments = Comment::find()->active(false)->all();
```
> Tip: 大きなプロジェクトでは、アクティブレコード・クラスをクリーンに保つことが出来るように、クエリ関連のコードのほとんどをカスタマイズされたクエリ・クラスに保持することが推奨されます。
> Tip: 大きなプロジェクトでは、アクティブレコード・クラスをクリーンに保つことが出来るように、クエリ関連のコードのほとんどをカスタマイズされたクエリ・クラスに保持することが推奨されます。
この新しいクエリ構築メソッドは、`Comment` に関するリレーションを定義するときや、リレーショナル・クエリを実行するときにも使用することが出来ます。
@ -1469,15 +1469,15 @@ $customers = Customer::find()->with([
## 追加のフィールドを選択する
アクティブレコードのインスタンスにクエリ結果からデータが投入されるときは、受け取ったデータセットのカラムの値が対応する属性に入れられます。
アクティブレコードのインスタンスにクエリ結果からデータが投入されるときは、受け取ったデータセットのカラムの値が対応する属性に入れられます。
クエリ結果から追加のカラムや値を取得して、アクティブレコードの内部に格納することが出来ます。
クエリ結果から追加のカラムや値を取得して、アクティブレコードの内部に格納することが出来ます。
例えば、ホテルの客室の情報を含む `room` という名前のテーブルがあるとしましょう。
そして、全ての客室のデータは `length` (長さ)、`width` (幅)、`height` (高さ) というフィールドを使って、部屋の幾何学的なサイズに関する情報を格納しているとします。
空いている全ての部屋の一覧を容積の降順で取得する必要がある場合を考えて見てください。
レコードをその値で並べ替える必要があるので、PHP を使って容積を計算することは出来ません。
しかし、同時に、一覧には `volume` (容積) も表示したいでしょう。
目的を達するためには、`Room` アクティブレコード・クラスにおいて追加のフィールドを宣言し、`volume` の値を格納する必要があります。
目的を達するためには、`Room` アクティブレコード・クラスにおいて追加のフィールドを宣言し、`volume` の値を格納する必要があります。
```php
class Room extends \yii\db\ActiveRecord

6
docs/guide-ja/db-dao.md

@ -2,7 +2,7 @@
====================================
[PDO](http://www.php.net/manual/ja/book.pdo.php) の上に構築された Yii DAO (データベース・アクセス・オブジェクト) は、リレーショナル・データベースにアクセスするためのオブジェクト指向 API を提供するものです。
これは、データベースにアクセスする他のもっと高度な方法、例えば [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) の基礎でもあります。
これは、データベースにアクセスする他のもっと高度な方法、例えば [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) の基礎でもあります。
Yii DAO を使うときは、主として素の SQL と PHP 配列を扱う必要があります。
結果として、Yii DAO はデータベースにアクセスする方法としては最も効率的なものになります。
@ -202,7 +202,7 @@ $post2 = $command->queryOne();
このやり方でクエリを実行すると、パラメータの値が違うごとに新しいクエリを実行するのに比べて、はるかに効率を良くすることが出来ます。
> Info: パラメータ・バインディングは、素の SQL を含む文字列に値を挿入しなければならない場所でのみ使用されます。
> [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) のような高レベルの抽象的レイヤーでは、
> [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) のような高レベルの抽象的レイヤーでは、
> 多くの場所で SQL に変換される値の配列を指定する場合がよくあります。
> これらの場所では Yii によってパラメータ・バインディングが内部的に実行されますので、
> パラメータを手動で指定する必要はありません。
@ -654,4 +654,4 @@ $table = Yii::$app->db->getTableSchema('post');
```
このメソッドは、テーブルのカラム、プライマリ・キー、外部キーなどの情報を含む [[yii\db\TableSchema]] オブジェクトを返します。
これらの情報は、主として [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) によって利用されて、特定のデータベースに依存しないコードを書くことを助けてくれています。
これらの情報は、主として [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) によって利用されて、特定のデータベースに依存しないコードを書くことを助けてくれています。

8
docs/guide-ja/db-migrations.md

@ -691,11 +691,11 @@ class m150101_185401_create_news_table extends Migration
これは、通常、データベースからのデータ取得については、メッセージを追加して表示する必要がないからです。
更にまた、複雑なクエリを構築して実行するためには、強力な [クエリ・ビルダ](db-query-builder.md) を使うことが出来るからです。
> Note: マイグレーションを使ってデータを操作する場合に、あなたは、あなたの [アクティブレコード](db-active-record.md) クラスをデータ操作に使えば便利じゃないか、と気付くかもしれません。
> なぜなら、いくつかのロジックは既にアクティブレコードで実装済みだから、と。
> Note: マイグレーションを使ってデータを操作する場合に、あなたは、あなたの [アクティブレコード](db-active-record.md) クラスをデータ操作に使えば便利じゃないか、と気付くかもしれません。
> なぜなら、いくつかのロジックは既にアクティブレコードで実装済みだから、と。
> しかしながら、マイグレーションの中で書かれるコードが永久に不変であることを本質とするのと対照的に、アプリケーションのロジックは変化にさらされるものであるということを心に留めなければなりません。
> 従って、マイグレーションのコードでアクティブレコードを使用していると、アクティブレコードのレイヤにおけるロジックの変更が思いがけず既存のマイグレーションを破壊することがあり得ます。
> このような理由のため、マイグレーションのコードはアクティブレコードのようなアプリケーションの他のロジックから独立を保つべきです。
> 従って、マイグレーションのコードでアクティブレコードを使用していると、アクティブレコードのレイヤにおけるロジックの変更が思いがけず既存のマイグレーションを破壊することがあり得ます。
> このような理由のため、マイグレーションのコードはアクティブレコードのようなアプリケーションの他のロジックから独立を保つべきです。
## マイグレーションを適用する <span id="applying-migrations"></span>

2
docs/guide-ja/helper-array.md

@ -419,7 +419,7 @@ $result = ArrayHelper::merge($array1, $array2);
## オブジェクトを配列に変換する <span id="converting-objects-to-arrays"></span>
オブジェクトまたはオブジェクトの配列を配列に変換する必要があることがよくあります。
最もよくあるのは、REST API によってデータ配列を提供するなどの目的で、アクティブレコード・モデルを変換する場合です。
最もよくあるのは、REST API によってデータ配列を提供するなどの目的で、アクティブレコード・モデルを変換する場合です。
そうするために、次のコードを使うことが出来ます。
```php

4
docs/guide-ja/input-forms.md

@ -1,7 +1,7 @@
フォームを作成する
==================
アクティブレコードに基づくフォーム : ActiveForm
アクティブレコードに基づくフォーム : ActiveForm
-----------------------------------------------
Yii においてフォームを使用するときは、主として [[yii\widgets\ActiveForm]] による方法を使います。
フォームがモデルに基づくものである場合はこの方法を選ぶべきです。
@ -10,7 +10,7 @@ Yii においてフォームを使用するときは、主として [[yii\widget
フォームは、クライアント・サイドで表示されるものですが、たいていの場合、対応する [モデル](structure-models.md) を持ち、それを使ってサーバ・サイドでフォームの入力を検証します
(入力の検証の詳細については、[入力を検証する](input-validation.md) のセクションを参照してください)。
モデルに基づくフォームを作成する場合、最初のステップは、モデルそのものを定義することです。
モデルは、データベースの何らかのデータを表現するために [アクティブレコード](db-active-record.md) から派生させたクラスか、あるいは、任意の入力、例えばログイン・フォームの入力を保持するための ([[yii\base\Model]] から派生させた) 汎用的な Model クラスか、どちらかにすることが出来ます。
モデルは、データベースの何らかのデータを表現するために [アクティブレコード](db-active-record.md) から派生させたクラスか、あるいは、任意の入力、例えばログイン・フォームの入力を保持するための ([[yii\base\Model]] から派生させた) 汎用的な Model クラスか、どちらかにすることが出来ます。
> Tip: フォームのフィールドがデータベースのカラムと異なっていたり、そのフォーム特有のフォーマット形式やロジックがあったりする場合は、
> [[yii\base\Model]] を拡張した独自のモデルを作るほうを選んで下さい。

2
docs/guide-ja/input-tabular-input.md

@ -2,7 +2,7 @@
==================================
時として、一つのフォームで同じ種類の複数のモデルを扱わなければならないことがあります。
例えば、それぞれが「名前-値」の形で保存され、`Setting` [アクティブレコード](db-active-record.md) モデルとして表される複数の設定項目を扱うフォームです。
例えば、それぞれが「名前-値」の形で保存され、`Setting` [アクティブレコード](db-active-record.md) モデルとして表される複数の設定項目を扱うフォームです。
この種のフォームは「表形式インプット」と呼ばれることもよくあります。
これとは対照的な、異なる種類のさまざまなモデルを扱うことについては、[複数のモデルを持つ複雑なフォーム](input-multiple-models.md) のセクションで扱います。

127
docs/guide-ja/intro-upgrade-from-v1.md

@ -5,9 +5,9 @@ Yii フレームワークは 2.0 のために完全に書き直されたため
結果として、バージョン 1.1 からのアップグレードは、マイナー・バージョン間でのアップグレードのような些細な仕事ではなくなりました。
このセクションでは、二つのバージョン間の主要な違いを説明します。
もし以前に Yii 1.1 を使ったことがなければ、あなたはこのセクションを飛ばして直接に "[始めよう](start-installation.md)" に進んでも、問題はありません。
もしあなたが以前に Yii 1.1 を使ったことがなければ、このガイドを飛ばして直接に "[始めよう](start-installation.md)" に進んでも、問題はありません。
Yii 2.0 はこの要約でカバーされているよりも多くの新機能を導入していることに注意してください。
Yii 2.0 はこの要約でカバーされているよりも多くの新機能を導入していることに注意してください。
決定版ガイド全体を通読して全ての新機能について学習することを強く推奨します。
おそらく、以前は自分自身で開発する必要があったいくつかの機能が、今ではコア・コードの一部になっていることに気付くでしょう。
@ -37,14 +37,15 @@ Yii 2.0 は PHP 5.4 以上を必要とします。PHP 5.4 は、Yii 1.1 によ
- [遅延静的束縛(Late Static Bindings)](http://php.net/manual/ja/language.oop5.late-static-bindings.php)。
- [日付と時刻](http://php.net/manual/ja/book.datetime.php)。
- [トレイト](http://php.net/manual/ja/language.oop5.traits.php)。
- [国際化(intl)](http://php.net/manual/ja/book.intl.php)。Yii 2.0 は国際化の機能をサポートするために `intl` PHP 拡張を利用しています。
- [国際化(intl)](http://php.net/manual/ja/book.intl.php)。
Yii 2.0 は国際化の機能をサポートするために `intl` PHP 拡張を利用しています。
名前空間
--------
Yii 2.0 での最も顕著な変更は名前空間の使用です。
ほとんど全てのコアクラスが、例えば、`yii\web\Request` のように名前空間に属します。
ほとんど全てのコアクラスが、例えば、`yii\web\Request` のように名前空間に属します。
クラス名に "C" の接頭辞はもう使われません。
命名のスキームはディレクトリ構造に従うようになりました。
例えば、`yii\web\Request` は、対応するクラス・ファイルが Yii フレームワーク・フォルダの下の `web/Request.php` であることを示します。
@ -57,17 +58,20 @@ Yii 2.0 での最も顕著な変更は名前空間の使用です。
Yii 2.0 は、1.1 の `CComponent` クラスを二つのクラス、すなわち、[[yii\base\BaseObject]] と [[yii\base\Component]] に分割しました。
[[yii\base\BaseObject|BaseObject]] クラスは、ゲッターとセッターを通じて [オブジェクト・プロパティ](concept-properties.md) を定義することを可能にする、軽量な基底クラスです。
[[yii\base\Component|Component]] クラスは [[yii\base\BaseObject|BaseObject]] からの拡張であり、[イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートします。
[[yii\base\Component|Component]] クラスは [[yii\base\BaseObject|BaseObject]] からの拡張であり、
[イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートします。
あなたのクラスがイベントやビヘイビアの機能を必要としない場合は、[[yii\base\BaseObject|BaseObject]] を基底クラスとして使うことを考慮すべきです。
通常は、基本的なデータ構造を表すクラスに対して、このことが当てはまります。
あなたのクラスがイベントやビヘイビアの機能を必要としない場合は、[[yii\base\BaseObject|BaseObject]]
を基底クラスとして使うことを考慮すべきです。
基本的なデータ構造を表すクラスに対して、通常、このことが当てはまります。
オブジェクトの構成
------------------
[[yii\base\BaseObject|BaseObject]] クラスはオブジェクトを構成するための統一された方法を導入しています。
[[yii\base\BaseObject|BaseObject]] の全ての派生クラスは、コンストラクタが必要な場合には、インスタンスが正しく構成されるように、コンストラクタを以下のようにして宣言しなければなりません。
[[yii\base\BaseObject|BaseObject]] の全ての派生クラスは、コンストラクタが必要な場合には、インスタンスが正しく構成されるように、
コンストラクタを以下のようにして宣言しなければなりません。
```php
class MyClass extends \yii\base\BaseObject
@ -89,10 +93,12 @@ class MyClass extends \yii\base\BaseObject
```
上記のように、コンストラクタは最後のパラメータとして構成情報の配列を取らなければなりません。
構成情報の配列に含まれる「名前-値」のペアが、コンストラクタの最後でプロパティを構成します。
[[yii\base\BaseObject::init()|init()]] メソッドをオーバーライドして、構成情報が適用された後に行うべき初期化処理を行うことが出来ます。
構成情報の配列に含まれる「名前・値」のペアが、コンストラクタの最後でプロパティを構成します。
[[yii\base\BaseObject::init()|init()]] メソッドをオーバーライドして、
構成情報が適用された後に行うべき初期化処理を行うことが出来ます。
この規約に従うことによって、新しいオブジェクトを生成して構成するときに、構成情報配列を使うことが出来るようになります。
この規約に従うことによって、構成情報配列を使って新しいオブジェクトを生成して構成することが
出来るようになります。
```php
$object = Yii::createObject([
@ -108,8 +114,7 @@ $object = Yii::createObject([
イベント
--------
Yii 1 では、イベントは `on` メソッド (例えば、`onBeforeSave`) を定義することによって作成されました。
Yii 2 では、どのようなイベント名でも使うことが出来るようになりました。
Yii 1 では、イベントは `on` メソッド (例えば、`onBeforeSave`) を定義することによって作成されました。Yii 2 では、どのようなイベント名でも使うことが出来るようになりました。
[[yii\base\Component::trigger()|trigger()]] メソッドを呼んでイベントを発生させます。
```php
@ -141,7 +146,7 @@ Yii 2.0 は、パス・エイリアスの使用を、ファイル/ディレク
ルートの名前空間に対しては、それぞれ、パス・エイリアスを定義することが推奨されます。
そうすれば、余計な構成をしなくても、Yii のクラス・オートローダを使うことが出来るようになります。
例えば、`@yii` が Yii のインストール・ディレクトリを指しているので、`yii\web\Request` というようなクラスをオートロードすることが出来る訳です。
サードパーティのライブラリ、例えば Zend フレームワークなどを使う場合にも、そのフレームワークのインストール・ディレクトリを指す `@Zend` というパス・エイリアスを定義することが出来ます。
サードパーティのライブラリ、例えば Zend フレームワークなどを使う場合にも、そのフレームワークのインストール・ディレクトリを指す `@Zend` というパス・エイリアスを定義することが出来ます。
一旦そうしてしまえば、その Zend フレームワークのライブラリ内のどんなクラスでも、Yii からオートロードすることが出来るようになります。
パス・エイリアスに関する詳細は [エイリアス](concept-aliases.md) のセクションを参照してください。
@ -151,14 +156,12 @@ Yii 2.0 は、パス・エイリアスの使用を、ファイル/ディレク
------
Yii 2 のビューについての最も顕著な変更は、ビューの中の `$this` という特殊な変数が現在のコントローラやウィジェットを指すものではなくなった、ということです。
今や `$this` は 2.0 で新しく導入された概念である *ビュー* オブジェクトを指します。
今や `$this` は 2.0 で新しく導入された概念である *ビュー*オブジェクトを指します。
*ビュー*・オブジェクトは [[yii\web\View]] という型であり、MVC パターンのビューの部分を表すものです。
ビューにおいてコントローラやウィジェットにアクセスしたい場合は、`$this->context` を使うことが出来ます。
パーシャル・ビューを別のビューの中でレンダリングするためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。
さらに、`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。
と言うのは、`render()` メソッドは、レンダリング結果を返すものであり、それを直接に表示するものではないからです。
例えば、
パーシャル・ビューを別のビューの中でレンダリングするためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。さらに、`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。
と言うのは、`render()` メソッドは、レンダリング結果を返すものであり、それを直接に表示するものではないからです。例えば、
```php
echo $this->render('_item', ['item' => $item]);
@ -166,20 +169,19 @@ echo $this->render('_item', ['item' => $item]);
PHP を主たるテンプレート言語として使う以外に、Yii 2.0 は人気のある二つのテンプレート・エンジン、Smarty と Twig に対する正式なサポートを備えています。
Prado テンプレート・エンジンはもはやサポートされていません。
これらのテンプレート・エンジンを使うためには、[[yii\base\View::$renderers|View::$renderers]] プロパティをセットして、`view` アプリケーション・コンポーネントを構成する必要があります。
これらのテンプレート・エンジンを使うためには、`view` アプリケーション・コンポーネントを構成して
[[yii\base\View::$renderers|View::$renderers]] プロパティをセットする必要があります。
詳細は [テンプレート・エンジン](tutorial-template-engines.md) のセクションを参照してください。
モデル
------
Yii 2.0 は [[yii\base\Model]] を 1.1 における `CModel` と同様な基底モデルとして使います。
`CFormModel` というクラスは完全に廃止されました。
Yii 2 では、それの代りに [[yii\base\Model]] を拡張して、フォームのモデル・クラスを作成すべきです。
Yii 2.0 は 1.1 における `CModel` と同様な [[yii\base\Model]] を基底モデルとして使います。`CFormModel` というクラスは完全に廃止されました。
Yii 2 では、それの代りに [[yii\base\Model]] を拡張して、フォームのモデル・クラスを作成しなければなりません。
Yii 2.0 は サポートされるシナリオを宣言するための [[yii\base\Model::scenarios()|scenarios()]] という新しいメソッドを導入しました。
このメソッドを使って、どのシナリオの下で、ある属性が検証される必要があるか、また、安全とみなされるか否か、などを宣言することが出来ます。
例えば、
このメソッドを使って、どのシナリオの下で、ある属性が検証される必要があるか、また、安全とみなされるか否か、などを宣言します。例えば、
```php
public function scenarios()
@ -193,13 +195,13 @@ public function scenarios()
上記では二つのシナリオ、すなわち、`backend` と `frontend` が宣言されています。
`backend` シナリオでは、`email` と `role` の属性が両方とも安全であり、一括代入が可能です。
`frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。
`email``role` は、両方とも、規則を使って検証されなければなりません。
`frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。`email` と `role` は、両方とも、規則を使って検証されなければなりません。
[[yii\base\Model::rules()|rules()]] メソッドが、Yii 1.1 に引き続き、検証規則を宣言するために使われます。
[[yii\base\Model::scenarios()|scenarios()]] が導入されたことにより、`unsafe` バリデータが無くなったことに注意してください。
ほとんどの場合、すなわち、[[yii\base\Model::rules()|rules()]] メソッドが存在しうるシナリオを完全に指定しており、そして `unsafe` な属性を宣言する必要が無いなら、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。
ほとんどの場合、すなわち、[[yii\base\Model::rules()|rules()]] メソッドが存在しうるシナリオを完全に指定しており、
そして `unsafe` な属性を宣言する必要が無い場合であれば、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。
モデルについての詳細を学習するためには、[モデル](structure-models.md) のセクションを参照してください。
@ -207,11 +209,11 @@ public function scenarios()
コントローラ
------------
Yii 2.0 は [[yii\web\Controller]] を基底のコントローラ・クラスとして使います。
これは Yii 1.1 における`CController` と同様なクラスです。
Yii 2.0 は [[yii\web\Controller]] を基底のコントローラ・クラスとして使います。これは Yii 1.1 における`CController` と同様なクラスです。
[[yii\base\Action]] がアクション・クラスの基底クラスです。
コントローラに関して、あなたのコードに最も顕著な影響を及ぼす変更点は、コントローラのアクションは表示したいコンテントを、エコーするのでなく、返さなければならなくなった、ということです。
コントローラに関して、あなたのコードに最も顕著な影響を及ぼす変更点は、
コントローラのアクションは表示したいコンテントを、エコーするのでなく、返さなければならなくなった、ということです。
```php
public function actionView($id)
@ -234,7 +236,8 @@ public function actionView($id)
Yii 2.0 は [[yii\base\Widget]] を基底のウィジェット・クラスとして使用します。これは Yii 1.1 の `CWidget` と同様なクラスです。
いろんな IDE においてフレームワークに対するより良いサポートを得るために、Yii 2.0 はウィジェットを使うための新しい構文を導入しました。
スタティックなメソッド [[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、そして [[yii\base\Widget::widget()|widget()]] が導入されました。以下のようにして使います。
スタティックなメソッド [[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、そして [[yii\base\Widget::widget()|widget()]] が導入されました。
以下のようにして使います。
```php
use yii\widgets\Menu;
@ -258,7 +261,7 @@ ActiveForm::end();
テーマ
------
テーマは 2.0 では完全に違う動をします。
テーマは 2.0 では完全に違う動き方をします。
テーマは、ソースのビュー・ファイル・パスをテーマのビュー・ファイル・パスにマップするパス・マッピング機構に基づくものになりました。
例えば、あるテーマのパス・マップが `['/web/views' => '/web/themes/basic']` である場合、ビュー・ファイル `/web/views/site/index.php` のテーマ版は `/web/themes/basic/site/index.php` になります。
この理由により、テーマはどのようなビュー・ファイルに対してでも適用することが出来るようになりました。
@ -292,7 +295,8 @@ Yii 2.0 はコメント・ブロックからコマンドのヘルプ情報を自
Yii 2.0 は [PECL intl PHP モジュール](http://pecl.php.net/package/intl) に賛同して、内蔵の日付フォーマッタと数字フォーマッタの部品を取り除きました。
メッセージは `i18n` アプリケーション・コンポーネント経由で翻訳されるようになりました。
このコンポーネントは一連のメッセージ・ソースを管理するもので、メッセージのカテゴリに基づいて異なるメッセージ・ソースを使うことを可能にするものです。
このコンポーネントは一連のメッセージ・ソースを管理するもので、
メッセージのカテゴリに基づいて異なるメッセージ・ソースを使うことを可能にするものです。
詳細については [国際化](tutorial-i18n.md) のセクションを参照してください。
@ -300,10 +304,9 @@ Yii 2.0 は [PECL intl PHP モジュール](http://pecl.php.net/package/intl)
アクション・フィルタ
--------------------
アクション・フィルタはビヘイビアによって実装されるようになりました。
新しいカスタム・フィルタを定義するためには、[[yii\base\ActionFilter]] を拡張します。
アクション・フィルタはビヘイビアによって実装されるようになりました。新しいカスタム・フィルタを定義するためには、[[yii\base\ActionFilter]] を拡張します。
フィルタを使うためには、そのフィルタ・クラスをビヘイビアとしてコントローラにアタッチします。
例えば、[[yii\filters\AccessControl]] を使うためには、コントローラに次のコードを書くことになります。
例えば、[[yii\filters\AccessControl]] フィルタを使うためには、コントローラに次のコードを書くことになります。
```php
public function behaviors()
@ -329,7 +332,8 @@ Yii 2.0 は、*アセット・バンドル* と呼ばれる新しい概念を導
アセット・バンドルは、あるディレクトリの下に集められた一群のアセット・ファイル (例えば、JavaScript ファイル、CSS ファイル、イメージ・ファイルなど) です。
それぞれのアセット・バンドルは [[yii\web\AssetBundle]] を拡張したクラスとして表わされます。
アセット・バンドルを [[yii\web\AssetBundle::register()]] を通じて登録することによって、そのバンドルに含まれるアセットにウェブ経由でアクセスできるようになります。
アセット・バンドルを [[yii\web\AssetBundle::register()]] を通じて登録することによって、
そのバンドルに含まれるアセットにウェブ経由でアクセスできるようになります。
Yii 1 とは異なり、バンドルを登録したページは、そのバンドルで指定されている JavaScript と CSS ファイルへの参照を自動的に含むようになります。
詳細については [アセット](structure-assets.md) のセクションを参照してください。
@ -346,8 +350,7 @@ Yii 2.0 はよく使われるスタティックなヘルパ・クラスを数多
* [[yii\helpers\FileHelper]]
* [[yii\helpers\Json]]
詳細については、ヘルパの [概要](helper-overview.md) のセクションを参照してください。
詳細については、[ヘルパの概要](helper-overview.md) のセクションを参照してください。
フォーム
--------
@ -389,19 +392,18 @@ $sql = $command->sql;
$rows = $command->queryAll();
```
何より良いのは、このようなクエリ構築メソッドが [アクティブレコード](db-active-record.md) を扱う時にも使える、ということです。
何より良いのは、このようなクエリ構築メソッドが [アクティブレコード](db-active-record.md) を扱う時にも使える、ということです。
詳細については [クエリ・ビルダ](db-query-builder.md) のセクションを参照してください。
アクティブレコード
------------------
アクティブレコード
--------------------
Yii 2.0 は [アクティブレコード](db-active-record.md) に数多くの変更を導入しました。
Yii 2.0 は [アクティブレコード](db-active-record.md) に数多くの変更を導入しました。
最も顕著な違いは、クエリの構築方法とリレーショナル・クエリの処理の二つです。
1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。
このクラスは [[yii\db\Query]] を拡張したものであり、従って全てのクエリ構築メソッドを継承します。
1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。このクラスは [[yii\db\Query]] を拡張したものであり、従って全てのクエリ構築メソッドを継承します。
以下のように、[[yii\db\ActiveRecord::find()]] を呼んでクエリの構築を開始します。
```php
@ -413,8 +415,7 @@ $customers = Customer::find()
```
リレーションを宣言するために必要なことは、[[yii\db\ActiveQuery|ActiveQuery]] オブジェクトを返す getter メソッドを定義するだけのことです。
getter によって定義されたプロパティの名前がリレーションの名前を表します。
例えば、以下のコードは `orders` リレーションを宣言するものです
getter によって定義されたプロパティの名前がリレーションの名前を表します。例えば、以下のコードは `orders` リレーションを宣言するものです
(1.1 では `relations()` という一個の中枢でリレーションを宣言しなければなりませんでした)。
```php
@ -428,7 +429,7 @@ class Customer extends \yii\db\ActiveRecord
```
こうすることで、`$customer->orders` という構文によって関連テーブルにある顧客のオーダにアクセスすることが出来るようになります。
また、下記のコードを用いて、カスタマイズしたクエリ条件によるオンザフライのリレーショナル・クエリを実行することも出来ます。
また、下記のコードを用いて、カスタマイズしたクエリ条件によるリレーショナル・クエリをその場で実行することも出来ます。
```php
$orders = $customer->getOrders()->andWhere('status=1')->all();
@ -439,8 +440,8 @@ $orders = $customer->getOrders()->andWhere('status=1')->all();
Yii 2.0 では、JOIN を使わずに二つの SQL 文が実行されます。
すなわち、第一の SQL 文が主たるレコードを返し、第二の SQL 文は主レコードのプライマリ・キーを使うフィルタリングによって関連レコードを返します。
多数のレコードを返すクエリを構築するときは、[[yii\db\ActiveRecord|ActiveRecord]] を返す代りに、[[yii\db\ActiveQuery::asArray()|asArray()]] メソッドをチェインすることが出来ます。
そうすると、クエリ結果は配列として返されることになり、レコードの数が多い場合は、必要 CPU 時間とメモリを著しく削減することが出来ます。
多数のレコードを返すクエリを構築するときは、[[yii\db\ActiveRecord|ActiveRecord]] オブジェクトを返す代りに、[[yii\db\ActiveQuery::asArray()|asArray()]] メソッドをチェインすることが出来ます。
そうすると、クエリ結果は配列として返されることになり、レコードの数が多い場合は、必要とされる CPU 時間とメモリを著しく削減することが出来ます。
例えば、
```php
@ -448,7 +449,7 @@ $customers = Customer::find()->asArray()->all();
```
もう一つの変更点は、属性のデフォルト値を public なプロパティによって定義することは出来なくなった、ということです。
デフォルト値を定義する必要がある場合は、アクティブレコード・クラスの `init` メソッドの中で設定しなければなりません。
デフォルト値を定義する必要がある場合は、アクティブレコード・クラスの `init` メソッドの中で設定しなければなりません。
```php
public function init()
@ -458,19 +459,18 @@ public function init()
}
```
1.1 では、アクティブレコード・クラスのコンストラクタをオーバーライドすることについて、いくつか問題がありました。
バージョン 2.0 では、もう問題はありません。
1.1 では、アクティブ・レコード・クラスのコンストラクタをオーバーライドすることについて、いくつか問題がありました。バージョン 2.0 では、もう問題はありません。
コンストラクタにパラメータを追加する場合は、[[yii\db\ActiveRecord::instantiate()]] をオーバーライドする必要があるかもしれないことに注意してください。
アクティブレコードについては、他にも多くの変更と機能強化がなされています。
詳細については [アクティブレコード](db-active-record.md) のセクションを参照してください。
アクティブレコードについては、他にも多くの変更と機能強化がなされています。
詳細については [アクティブレコード](db-active-record.md) のセクションを参照してください。
アクティブレコードのビヘイビア
------------------------------
アクティブレコードのビヘイビア
--------------------------------
2.0 では基底のビヘイビア・クラス `CActiveRecordBehavior` が廃止されました。
アクティブレコードのビヘイビアを作成したいときは、直接に `yii\base\Behavior` を拡張しなければなりません。
2.0 では基底のビヘイビア・クラス `CActiveRecordBehavior` を廃止しました。
アクティブレコードのビヘイビアを作成したいときは、直接に `yii\base\Behavior` を拡張しなければなりません。
ビヘイビア・クラスがオーナーの何らかのイベントに反応する必要がある場合は、以下のように `events()` メソッドをオーバーライドしなければなりません。
```php
@ -502,10 +502,10 @@ User と IdentityInterface
-------------------------
1.1 の `CWebUser` クラスは [[yii\web\User]] に取って換られました。
そして `CUserIdentity` クラスはもうありません。代りに、使い方がもっと単純な [[yii\web\IdentityInterface]] を実装すべきです
そして `CUserIdentity` クラスはもうありません。代りに、使い方がもっと単純な [[yii\web\IdentityInterface]] を実装しなければなりません
アドバンスト・プロジェクト・テンプレートがそういう例を提供しています。
詳細は [認証](security-authentication.md)、[権限付与](security-authorization.md)、そして [アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) のセクションを参照してください。
詳細は [認証](security-authentication.md)、[権限付与](security-authorization.md)、そして [アドバンスト・プロジェクト・テンプレート](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) のセクションを参照してください。
URL 管理
@ -526,7 +526,8 @@ Yii 2 の URL 管理は 1.1 のそれと似たようなものです。
詳細については [ルーティングと URL 生成](runtime-routing.md) のセクションを参照してください。
ルートの命名規約における重要な変更は、コントローラとアクションのキャメルケースの名前が各単語をハイフンで分けた小文字の名前になるようになった、という点です。
ルートの命名規約における重要な変更は、コントローラとアクションのキャメル・ケースの名前が
各単語をハイフンで分けた小文字の名前になるようになった、という点です。
例えば、`CamelCaseController` のコントローラ ID は `camel-case` となります。
詳細については、[コントローラ ID](structure-controllers.md#controller-ids) と [アクション ID](structure-controllers.md#action-ids) のセクションを参照してください。

20
docs/guide-ja/intro-yii.md

@ -11,7 +11,8 @@ Yii は何に適しているか
Yii は汎用的なウェブ・プログラミング・フレームワークです。
つまり、あらゆる種類のウェブ・アプリケーションを PHP を使って開発するときに、Yii を使用することが出来ます。
コンポーネント・ベースのアーキテクチャと洗練されたキャッシュ・サポートを持っているため、Yii は大規模なアプリケーション、たとえば、ポータル、フォーラム、コンテント・マネージメント・システム (CMS)、電子商取引プロジェクト、RESTful ウェブ・サービス、等々を開発するのに特に適しています。
コンポーネント・ベースのアーキテクチャと洗練されたキャッシュ・サポートを有しているため、Yii は大規模なアプリケーション、
たとえば、ポータル、フォーラム、コンテント・マネージメント・システム (CMS)、電子商取引プロジェクト、RESTful ウェブ・サービス、等々を開発するのに特に適しています。
Yii を他のフレームワークと比べると
@ -19,25 +20,28 @@ Yii を他のフレームワークと比べると
あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなのかを知りたいでしょう。
- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) アーキテクチャ・パターンを実装し、このパターンに基づいたコードの編成を推進しています。
- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) アーキテクチャ・パターンを実装し、
このパターンに基づいたコードの編成を推進しています。
- Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。
何らかのデザイン・パターンの厳密な遵守を主な目的とする凝りすぎた設計を、Yii がしようと試みることは決してありません
何らかのデザイン・パターンの厳密な遵守を主目的とする凝りすぎた設計は、Yii が決して試みようとしないものです
- Yii はフル装備のフレームワークです。
クエリ・ビルダ、リレーショナル・データベースと NoSQL データベースの双方のためのアクティブレコード、RESTful API 開発サポート、多層構成のキャッシュ・サポート、その他、検証済みで直ちに使える多数の機能を提供します。
クエリ・ビルダ、リレーショナル・データベースと NoSQL データベース双方のためのアクティブ・レコード、RESTful API 開発サポート、多層構成のキャッシュ・サポート、
等々、検証済みで直ちに使える多数の機能を提供します。
- Yii は極めて拡張性の高いフレームワークです。あなたはコアのコードのほとんど全ての要素をカスタマイズしたり置き換えたりすることが出来ます。
また、Yii の堅固なエクステンション・アーキテクチャを利用して、再配布可能なエクステンションを使用したり開発したりすることも出来ます。
- 高性能であることは常に Yii の主たる目標です。
Yii はワンマン・ショーではありません。Yii は [強力なコア開発チーム](http://www.yiiframework.com/team/) および Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。
Yii はワンマン・ショーではありません。Yii は [強力なコア開発チーム](http://www.yiiframework.com/team/) および
Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。
Yii 開発チームは、最新のウェブ開発の潮流と、他のフレームワークやプロジェクトに見出される最善のプラクティスと機能を、注意深く見守り続けています。
他のところで見出された最善のプラクティスと機能で最も適切なものは、定期的にコアフレームワークに組み込まれ、シンプルかつエレガントなインタフェイスを通じて公開されます。
他のところで見出された最善のプラクティスと機能で最も適切なものは、定期的にコア・フレームワークに組み込まれ、
シンプルかつエレガントなインタフェイスを通じて公開されます。
Yii のバージョン
----------------
Yii は現在、利用可能な二つのメジャー・バージョン、すなわち 1.1 と 2.0 を持っています。
バージョン 1.1 は古い世代のもので、現在はメンテナンス・モードにあります。
Yii は現在、利用可能な二つのメジャー・バージョン、すなわち 1.1 と 2.0 を持っています。バージョン 1.1 は古い世代のもので、現在はメンテナンス・モードにあります。
バージョン 2.0 は、最新のテクノロジーとプロトコル、例えば、Composer、PSR、名前空間、トレイトなどを採用して、Yii を完全に書き直したものです。
バージョン 2.0 がこのフレームワークの現世代を表すものであり、今後数年間にわたって主要な開発努力の対象となるものです。
このガイドは主としてバージョン 2.0 について述べます。

6
docs/guide-ja/output-data-providers.md

@ -9,7 +9,7 @@
Yii のリリースには次のデータ・プロバイダのクラスが含まれています。
* [[yii\data\ActiveDataProvider]]: [[yii\db\Query]] または [[yii\db\ActiveQuery]] を使ってデータベースからデータを取得して、配列または [アクティブレコード](db-active-record.md) インスタンスの形式でデータを返します。
* [[yii\data\ActiveDataProvider]]: [[yii\db\Query]] または [[yii\db\ActiveQuery]] を使ってデータベースからデータを取得して、配列または [アクティブレコード](db-active-record.md) インスタンスの形式でデータを返します。
* [[yii\data\SqlDataProvider]]: SQL 文を実行して、データベースのデータを配列として返します。
* [[yii\data\ArrayDataProvider]]: 大きな配列を受け取り、ページネーションと並べ替えの指定に基づいて、一部分を切り出して返します。
@ -54,7 +54,7 @@ echo yii\grid\GridView::widget([
[[yii\data\ActiveDataProvider]] を使用するためには、その [[yii\data\ActiveDataProvider::query|query]] プロパティを構成しなければなりません。
これは、[[yii\db\Query]] または [[yii\db\ActiveQuery]] のオブジェクトを取ることが出来ます。
前者であれば、返されるデータは配列になります。
後者であれば、返されるデータは配列または [アクティブレコード](db-active-record.md) インスタンスとすることが出来ます。
後者であれば、返されるデータは配列または [アクティブレコード](db-active-record.md) インスタンスとすることが出来ます。
例えば、
```php
@ -139,7 +139,7 @@ $models = $provider->getModels();
[[yii\data\ArrayDataProvider]] は、一つの大きな配列を扱う場合に最も適しています。
このデータ・プロバイダによって、一つまたは複数のカラムで並べ替えた配列データの 1 ページ分を返すことが出来ます。
[[yii\data\ArrayDataProvider]] を使用するためには、全体の大きな配列として [[yii\data\ArrayDataProvider::allModels|allModels]] プロパティを指定しなければなりません。
この大きな配列の要素は、連想配列 (例えば [DAO](db-dao.md) のクエリ結果) またはオブジェクト (例えば [アクティブレコード](db-active-record.md) インスタンス) とすることが出来ます。
この大きな配列の要素は、連想配列 (例えば [DAO](db-dao.md) のクエリ結果) またはオブジェクト (例えば [アクティブレコード](db-active-record.md) インスタンス) とすることが出来ます。
例えば、
```php

10
docs/guide-ja/output-data-widgets.md

@ -12,7 +12,7 @@ DetailView <span id="detail-view"></span>
DetailView は単一のデータ [[yii\widgets\DetailView::$model|モデル]] の詳細を表示します。
モデルを標準的な書式で表示する場合 (例えば、全てのモデル属性をそれぞれテーブルの一行として表示する場合) に最も適しています。
モデルは [[\yii\base\Model]] またはそのサブ・クラス、例えば [アクティブレコード](db-active-record.md) のインスタンスか、連想配列かのどちらかにすることが出来ます。
モデルは [[\yii\base\Model]] またはそのサブ・クラス、例えば [アクティブレコード](db-active-record.md) のインスタンスか、連想配列かのどちらかにすることが出来ます。
DetailView は [[yii\widgets\DetailView::$attributes]] プロパティを使って、モデルのどの属性が表示されるべきか、また、どういうフォーマットで表示されるべきかを決定します。
利用できるフォーマットのオプションについては、[フォーマッタのセクション](output-formatting.md) を参照してください。
@ -360,7 +360,7 @@ echo GridView::widget([
データをフィルタリングするためには、GridView は検索基準を表す [モデル](structure-models.md) を必要とします。
検索基準は、通常は、グリッドビューのテーブルのフィルタのフィールドから取得されます。
[アクティブレコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデル・クラスを作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。
[アクティブレコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデル・クラスを作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。
このクラスが、グリッドビューのテーブルに表示されるフィルタ・コントロールのための検証規則を定義し、
検索基準に従って修正されたクエリを持つデータ・プロバイダを返す `search()` メソッドを提供します。
@ -527,7 +527,7 @@ $query->andFilterWhere(['>=', 'creation_date', $this->createdFrom])
### モデルのリレーションを扱う <span id="working-with-model-relations"></span>
GridView でアクティブレコードを表示するときに、リレーションのカラムの値、例えば、単に投稿者の `id` というのではなく、投稿者の名前を表示するという場合に遭遇するかも知れません。
GridView でアクティブレコードを表示するときに、リレーションのカラムの値、例えば、単に投稿者の `id` というのではなく、投稿者の名前を表示するという場合に遭遇するかも知れません。
`Post` モデルが `author` という名前のリレーションを持っていて、その投稿者のモデルが `name` という属性を持っているなら、[[yii\grid\GridView::$columns]] の属性名を `author.name` と定義します。
そうすれば、GridView が投稿者の名前を表示するようになります。
ただし、並べ替えとフィルタリングは、デフォルトでは有効になりません。
@ -611,7 +611,7 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name'
> $dataProvider->sort->defaultOrder = ['author.name' => SORT_ASC];
> ```
> Info: `joinWith` およびバックグラウンドで実行されるクエリの詳細については、[アクティブレコード - リレーションを使ってテーブルを結合する](db-active-record.md#joining-with-relations) を参照してください。
> Info: `joinWith` およびバックグラウンドで実行されるクエリの詳細については、[アクティブレコード - リレーションを使ってテーブルを結合する](db-active-record.md#joining-with-relations) を参照してください。
#### SQL ビューを使って、データのフィルタリング・並べ替え・表示をする <span id="using-sql-views"></span>
@ -673,7 +673,7 @@ class UserView extends ActiveRecord
}
```
このようにした後は、この UserView アクティブレコードを検索用のモデルとともに使うことが出来ます。
このようにした後は、この UserView アクティブレコードを検索用のモデルとともに使うことが出来ます。
並べ替えやフィルタリングの属性を追加で定義する必要はありません。
全ての属性がそのままで動作します。
この手法にはいくつかの長所と短所があることに注意してください。

2
docs/guide-ja/output-sorting.md

@ -40,7 +40,7 @@ $articles = Article::find()
上記の例では、[[yii\data\Sort|Sort]] オブジェクトに対して二つの属性が宣言されています。
すなわち、`age` と `name` です。
`age` 属性は `Article` アクティブレコード・クラスの `age` 属性に対応する *単純な* 属性です。
`age` 属性は `Article` アクティブレコード・クラスの `age` 属性に対応する *単純な* 属性です。
これは、次の宣言と等価です。
```php

4
docs/guide-ja/rest-controllers.md

@ -5,8 +5,8 @@
Yii は、RESTful アクションを作成する仕事を簡単にするための二つの基底コントローラ・クラスを提供しています。
すなわち、[[yii\rest\Controller]] と [[yii\rest\ActiveController]] です。
二つのコントローラの違いは、後者は [アクティブレコード](db-active-record.md) として表現されるリソースの扱いに特化した一連のアクションをデフォルトで提供する、という点にあります。
従って、あなたが [アクティブレコード](db-active-record.md) を使っていて、提供される組み込みのアクションに満足できるのであれば、コントローラ・クラスを [[yii\rest\ActiveController]] から拡張することを検討すると良いでしょう。
二つのコントローラの違いは、後者は [アクティブレコード](db-active-record.md) として表現されるリソースの扱いに特化した一連のアクションをデフォルトで提供する、という点にあります。
従って、あなたが [アクティブレコード](db-active-record.md) を使っていて、提供される組み込みのアクションに満足できるのであれば、コントローラ・クラスを [[yii\rest\ActiveController]] から拡張することを検討すると良いでしょう。
そうすれば、最小限のコードで強力な RESTful API を作成することが出来ます。
[[yii\rest\Controller]] と [[yii\rest\ActiveController]] は、ともに、下記の機能を提供します。

4
docs/guide-ja/rest-quick-start.md

@ -4,7 +4,7 @@
Yii は、RESTful ウェブサービス API を実装する仕事を簡単にするために、一揃いのツールを提供しています。
具体的に言えば、RESTful API に関する次の機能をサポートしています。
* [アクティブレコード](db-active-record.md) のための共通 API をサポートした迅速なプロトタイプ作成
* [アクティブレコード](db-active-record.md) のための共通 API をサポートした迅速なプロトタイプ作成
* レスポンス形式のネゴシエーション (デフォルトで JSON と XML をサポート)
* 出力フィールドの選択をサポートした、カスタマイズ可能なオブジェクトのシリアライゼーション
* コレクション・データと検証エラーの適切な書式設定
@ -20,7 +20,7 @@ Yii は、RESTful ウェブサービス API を実装する仕事を簡単にす
以下においては、例を使って、どのようにして最小限のコーディング労力で一組の RESTful API を構築することが出来るかを説明します。
ユーザのデータを RESTful API によって公開したいと仮定しましょう。
ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [アクティブレコード](db-active-record.md) クラス `app\models\User` が既に作成済みであるとします。
ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [アクティブレコード](db-active-record.md) クラス `app\models\User` が既に作成済みであるとします。
## コントローラを作成する <span id="creating-controller"></span>

2
docs/guide-ja/rest-resources.md

@ -11,7 +11,7 @@ MVC の枠組の中では、リソースは [モデル](structure-models.md) と
* [[yii\base\Model]] は [入力値の検証](input-validation.md) をサポートしています。
これは、RESTful API がデータ入力をサポートする必要がある場合に役に立ちます。
* [[yii\db\ActiveRecord]] は DB データのアクセスと操作に対する強力なサポートを提供しています。
リソース・データがデータベースに保存されているときは、アクティブレコードが最適の選択です。
リソース・データがデータベースに保存されているときは、アクティブレコードが最適の選択です。
このセクションでは、主として、[[yii\base\Model]] クラス (またはその子クラス) から拡張したリソース・クラスにおいて、RESTful API を通じて返すことが出来るデータを指定する方法を説明します。
リソース・クラスが [[yii\base\Model]] から拡張したものでない場合は、全てのパブリックなメンバ変数が返されます。

2
docs/guide-ja/runtime-bootstrapping.md

@ -23,7 +23,7 @@
ブートストラップの仕事は *全て* のリクエストを処理する前に、毎回しなければなりませんので、この過程を軽いものに保って可能な限り最適化することは非常に重要なことです。
あまりに多くのブートストラップ・コンポーネントを登録しないように努めてください。
ブートストラップ・コンポーネントが必要になるのは、リクエスト処理のライフサイクル全体に関与する必要がある場合だけです。
ブートストラップ・コンポーネントが必要になるのは、リクエスト処理のライフサイクル全体に関与する必要がある場合だけです。
例えば、モジュールが追加の URL 解析規則を登録する必要がある場合は、モジュールを [bootstrap プロパティ](structure-applications.md#bootstrap) のリストに挙げなければなりません。
なぜなら、URL 規則を使ってリクエストが解決される前に、新しい URL 規則を有効にしなければならないからです。

2
docs/guide-ja/runtime-overview.md

@ -17,6 +17,6 @@ Yii のアプリケーションがリクエストを処理するときは、毎
次の図は、アプリケーションがどのようにしてリクエストを処理するかを示すものです。
![リクエストのライフサイクル](images/request-lifecycle.png)
![リクエストのライフサイクル](images/request-lifecycle.png)
このセクションでは、これらのステップのいくつかについて、どのように動作するかを詳細に説明します。

4
docs/guide-ja/security-authentication.md

@ -45,7 +45,7 @@ return [
特定のメソッドが必要でない場合は、中身を空にして実装しても構いません。
例えば、あなたのアプリケーションが純粋なステート・レス RESTful アプリケーションであるなら、実装する必要があるのは [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]] と [[yii\web\IdentityInterface::getId()|getId()]] だけであり、他のメソッドは全て中身を空にしておくことが出来ます。
次の例では、[[yii\web\User::identityClass|ユーザ識別情報クラス]] は、`user` データベース・テーブルと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されています。
次の例では、[[yii\web\User::identityClass|ユーザ識別情報クラス]] は、`user` データベース・テーブルと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されています。
```php
<?php
@ -131,7 +131,7 @@ class User extends ActiveRecord implements IdentityInterface
```
> Note: ユーザ識別情報クラスである `User` と [[yii\web\User]] を混同してはいけません。
前者は認証のロジックを実装するクラスであり、普通は、ユーザの認証情報を保存する何らかの持続的ストレージと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されます。
前者は認証のロジックを実装するクラスであり、普通は、ユーザの認証情報を保存する何らかの持続的ストレージと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されます。
後者はユーザの認証状態の管理に責任を持つアプリケーション・コンポーネントです。

2
docs/guide-ja/security-authorization.md

@ -601,7 +601,7 @@ public function behaviors()
'allow' => true,
'actions' => ['update'],
'roles' => ['updatePost'],
'roleParams' => ['postId' => Yii::$app->request->get('id')];
'roleParams' => ['postId' => Yii::$app->request->get('id')],
],
```

2
docs/guide-ja/security-best-practices.md

@ -69,7 +69,7 @@ SELECT * FROM user WHERE username = ''; DROP TABLE user; --'
これは有効なクエリで、空のユーザ名を持つユーザを探してから、`user` テーブルを削除します。
おそらく、ウェブ・サイトは破壊されて、データは失われることになります (定期的なバックアップは設定済みですよね、ね? )。
Yii においては、ほとんどのデータベース・クエリは、PDO のプリペアド・ステートメントを適切に使用する [アクティブレコード](db-active-record.md) を経由して実行されます。
Yii においては、ほとんどのデータベース・クエリは、PDO のプリペアド・ステートメントを適切に使用する [アクティブレコード](db-active-record.md) を経由して実行されます。
プリペアド・ステートメントの場合は、上で説明したようなクエリの改竄は不可能です。
それでも、[生のクエリ](db-dao.md) や [クエリ・ビルダ](db-query-builder.md) を必要とする場合はあります。

67
docs/guide-ja/start-databases.md

@ -2,13 +2,15 @@
==================
このセクションでは、`country` という名前のデータベース・テーブルから読み出した国データを表示する新しいページの作り方を説明します。
この目的を達するために、データベース接続を構成し、[アクティブレコード](db-active-record.md) クラスを作成し、[アクション](structure-controllers.md) を定義し、そして [ビュー](structure-views.md) を作成します。
この目的を達するために、データベース接続を構成し、
[アクティブ・レコード](db-active-record.md) クラスを作成し、[アクション](structure-controllers.md) を定義し、
そして [ビュー](structure-views.md) を作成します。
このチュートリアルを通じて、次のことを学びます。
* DB 接続を構成する方法
* アクティブレコードのクラスを定義する方法
* アクティブレコードのクラスを使ってデータを検索する方法
* アクティブレコードのクラスを定義する方法
* アクティブレコードのクラスを使ってデータを検索する方法
* 改ページを伴う仕方でビューにデータを表示する方法
このセクションを完了するためには、データベースを使うことについて基本的な知識と経験が無ければならないことに注意してください。
@ -19,11 +21,9 @@
----------------------
まず初めに、`yii2basic` という名前のデータベースを作成してください。このデータベースからアプリケーションにデータを読み出すことになります。
Yii は多数のデータベース製品に対するサポートを内蔵していますので、作成するデータベースは、SQLite、MySQL、PosttreSQL、MSSQL または Oracle から選ぶことが出来ます。
以下の説明では、話を単純にするために、MySQL を前提とします。
Yii は多数のデータベース製品に対するサポートを内蔵しており、作成するデータベースは、SQLite、MySQL、PosttreSQL、MSSQL または Oracle から選ぶことが出来ます。以下の説明では、話を単純にするために、MySQL を前提とします。
次に、データベースに `country` という名前のテーブルを作り、いくつかのサンプル・データを挿入します。
そうするためには、次の SQL 文を実行することが出来ます。
次に、データベースに `country` という名前のテーブルを作り、いくつかのサンプル・データを挿入します。そうするためには、次の SQL 文を実行することが出来ます。
```sql
CREATE TABLE `country` (
@ -46,11 +46,11 @@ INSERT INTO `country` VALUES ('US','United States',322976000);
この時点で、あなたは `yii2basic` という名前のデータベースを持ち、その中に三つのカラムを持つ `country` というテーブルがあり、`country` テーブルは 10 行のデータを持っている、ということになります。
DB 接続を構成する <span id="configuring-db-connection"></span>
-----------------
先に進む前に、[PDO](http://www.php.net/manual/en/book.pdo.php) PHP 拡張および使用しているデータベースの PDO ドライバ (例えば、MySQL のための `pdo_mysql`) の両方をインストール済みであることを確認してください。
先に進む前に、[PDO](http://www.php.net/manual/en/book.pdo.php) PHP 拡張および使用しているデータベースの PDO ドライバ
(例えば、MySQL のための `pdo_mysql`) の両方をインストール済みであることを確認してください。
アプリケーションがリレーショナル・データベースを使う場合、これは基本的な必要条件です。
これらがインストール済みなら、`config/db.php` というファイルを開いて、あなたのデータベースに適合するようにパラメータを変更してください。
@ -68,14 +68,16 @@ return [
];
```
この `config/db.php` というファイルは典型的なファイルベースの [構成情報](concept-configurations.md) ツールです。
この構成情報ファイルが、背後のデータベースに対する SQL クエリの実行を可能にする [[yii\db\Connection]] インスタンスの作成と初期化に必要なパラメータを指定するものです。
この `config/db.php` というファイルは典型的なファイル・ベースの [構成情報](concept-configurations.md) ツールです。
この構成情報ファイルが、背後のデータベースに対する SQL クエリの実行を可能にする [[yii\db\Connection]]
インスタンスの作成と初期化に必要なパラメータを指定するものです。
上記のようにして構成された DB 接続は、アプリケーション・コードの中で `Yii::$app->db` という式でアクセスすることが出来ます。
> Info: `config/db.php` は、メインのアプリケーション構成情報ファイルである `config/web.php` によってインクルードされます。
この `config/web.php` が [アプリケーション](structure-applications.md) インスタンスが初期化される仕方を指定するものです。
詳しい情報については、[構成情報](concept-configurations.md) のセクションを参照してください。
Yii がサポートを内蔵していないデータベースを扱う必要がある場合は、以下のエクステンションの利用を検討してください。
- [Informix](https://github.com/edgardmessias/yii2-informix)
@ -83,10 +85,11 @@ Yii がサポートを内蔵していないデータベースを扱う必要が
- [Firebird](https://github.com/edgardmessias/yii2-firebird)
アクティブレコードを作成する <span id="creating-active-record"></span>
----------------------------
アクティブレコードを作成する <span id="creating-active-record"></span>
------------------------------
`country` テーブルの中のデータを表現し取得するために、[アクティブレコード](db-active-record.md) から派生した `Country` という名前のクラスを作成し、それを `models/Country.php` というファイルに保存します。
`country` テーブルの中のデータを表現し取得するために、[アクティブ・レコード](db-active-record.md) から派生した `Country` という名前のクラスを作成し、
それを `models/Country.php` というファイルに保存します。
```php
<?php
@ -103,7 +106,8 @@ class Country extends ActiveRecord
`Country` クラスは [[yii\db\ActiveRecord]] を拡張しています。この中には一つもコードを書く必要はありません。
単に上記のコードだけで、Yii は関連付けられたテーブル名をクラス名から推測します。
> Info: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]] メソッドをオーバーライドして、関連づけられたテーブル名を明示的に指定することが出来ます。
> Info: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]]
メソッドをオーバーライドして、関連づけられたテーブル名を明示的に指定することが出来ます。
`Country` クラスを使うことによって、以下のコード断片で示すように、`country` テーブルの中のデータを簡単に操作することが出来ます。
@ -124,8 +128,7 @@ $country->name = 'U.S.A.';
$country->save();
```
> Info: アクティブレコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。
[アクティブレコード](db-active-record.md) のセクションで、詳細な情報を得ることが出来ます。
> Info: アクティブ・レコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。[アクティブ・レコード](db-active-record.md) のセクションで、詳細な情報を得ることが出来ます。
もう一つの方法として、[データベース・アクセス・オブジェクト](db-dao.md) と呼ばれる、より低レベルなデータ・アクセス方法を使ってデータベースを操作することも出来ます。
@ -172,13 +175,14 @@ class CountryController extends Controller
上記のコードを `controllers/CountryController.php` というファイルに保存します。
`index` アクションは `Country::find()` を呼び出します。
このアクティブレコードのメソッドは DB クエリを構築して、`country` テーブルから全てのデータを読み出します。
`index` アクションは `Country::find()` を呼び出します。このアクティブ・レコードのメソッドは DB クエリを構築して、`country` テーブルから全てのデータを読み出します。
一回のリクエストで返される国の数を制限するために、クエリは [[yii\data\Pagination]] オブジェクトの助けを借りてページ付けされます。
`Pagination` オブジェクトは二つの目的に奉仕します。
* クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、一度に一ページ分のデータだけ (1ページ最大5行) を返すようにします。
* 次の項で説明されるように、一連のページ・ボタンからなるページャをビューに表示するために使われます。
* クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、
一度に一ページ分のデータだけ (1ページ最大5行) を返すようにします。
* 次の項で説明されるように、一連のページ・ボタンからなるページャを
ビューに表示するために使われます。
コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングしています。
このとき、国データだけでなく、そのページネーション情報がビューに渡されます。
@ -226,8 +230,7 @@ http://hostname/index.php?r=country%2Findex
![国リスト](images/start-country-list.png)
最初、ページは5つの国を表示しています。
そして、国リストの下には、4つのボタンを持ったページャがあります。
最初、ページは5つの国を表示しています。そして、国リストの下には、4つのボタンを持ったページャがあります。
"2" のボタンをクリックすると、ページはデータベースにある次の5つの国、すなわち、2ページ目のレコードを表示します。
注意深く観察すると、ブラウザの URL も次のように変ったことに気付くでしょう。
@ -235,16 +238,17 @@ http://hostname/index.php?r=country%2Findex
http://hostname/index.php?r=country%2Findex&page=2
```
舞台裏では、[[yii\data\Pagination|Pagination]] が、データセットをページ付けするのに必要な全ての機能を提供しています。
舞台裏では、[[yii\data\Pagination|Pagination]] が、データセットをページ付けするのに必要な全ての機能を提供しています。
* 初期状態では、[[yii\data\Pagination|Pagination]] は、1ページ目を表しています。
これを反映して、国の SELECT クエリは `LIMIT 5 OFFSET 0` という句を伴うことになります。
その結果、最初の5つの国が取得されて表示されます。
* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された URL を使ってページ・ボタンをレンダリングします。
これを反映して、国の SELECT クエリは `LIMIT 5 OFFSET 0` という句を伴うことになります。その結果、最初の5つの国が取得されて表示されます。
* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された
URL を使ってページ・ボタンをレンダリングします。
URL は、別々のページ番号を表現する `page` というクエリ・パラメータを含んだものになります。
* ページボタン "2" をクリックすると、`country/index` のルートに対する新しいリクエストが発行され、処理されます。
* ページボタン "2" をクリックすると、`country/index` のルートに対する新しいリクエストが発行され、処理されます。
[[yii\data\Pagination|Pagination]] が URL から `page` クエリ・パラメータを読み取って、カレント・ページ番号を 2 にセットします。
こうして、新しい国のクエリは `LIMIT 5 OFFSET 5` という句を持ち、次の5つの国を表示のために返すことになります。
こうして、新しい国のクエリは `LIMIT 5 OFFSET 5` という句を持ち、
次の5つの国を表示のために返すことになります。
まとめ <span id="summary"></span>
@ -253,6 +257,7 @@ http://hostname/index.php?r=country%2Findex&page=2
このセクションでは、データベースを扱う方法を学びました。
また、[[yii\data\Pagination]] と [[yii\widgets\LinkPager]] の助けを借りて、ページ付けされたデータを取得し表示する方法も学びました。
次のセクションでは、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) と呼ばれる強力なコード生成ツールを使う方法を学びます。
このツールは、データベース・テーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、通常必要とされることが多いいくつかの機能の迅速な実装を手助けしてくれるものです。
次のセクションでは、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) と呼ばれる強力なコード生成ツールを使う方法を学びます。
このツールは、データベース・テーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、
通常必要とされることが多い諸機能の迅速な実装を手助けしてくれるものです。
実際のところ、あなたがたった今書いたばかりのコードは、Gii ツールを使えば、全部、Yii が自動的に生成してくれるものです。

46
docs/guide-ja/start-forms.md

@ -3,9 +3,10 @@
このセクションでは、ユーザからデータを取得するためのフォームを持つ新しいページを作る方法を説明します。
このページは名前のインプット・フィールドとメールのインプット・フィールドを持つフォームを表示します。
ユーザからこれら二つの情報を受け取った後、ページは入力された値を確認のためにエコー・バックします。
ユーザからこれら二つの情報を受け取った後、ウェブ・ページは確認のために入力された値をエコー・バックします。
この目的を達するために、一つの [アクション](structure-controllers.md) と 二つの [ビュー](structure-views.md) を作成する以外に、一つの [モデル](structure-models.md) をも作成します。
この目的を達するために、一つの [アクション](structure-controllers.md) と 二つの [ビュー](structure-views.md) を作成する以外に、
一つの [モデル](structure-models.md) をも作成します。
このチュートリアルを通じて、次の方法を学びます。
@ -17,7 +18,8 @@
モデルを作成する <span id="creating-model"></span>
----------------
ユーザに入力してもらうデータは、下に示されているように `EntryForm` モデル・クラスとして表現され、`models/EntryForm.php` というファイルに保存されます。
ユーザに入力してもらうデータは、下に示されているように `EntryForm` モデル・クラスとして表現され、
`models/EntryForm.php` というファイルに保存されます。
クラス・ファイルの命名規約についての詳細は [クラスのオートロード](concept-autoloading.md) のセクションを参照してください。
```php
@ -44,7 +46,7 @@ class EntryForm extends Model
```
このクラスは、Yii によって提供される基底クラス [[yii\base\Model]] を拡張するものです。
通常、この基底クラスがフォームデータを表現するのに使われます。
通常、この基底クラスがフォームデータを表現するのに使われます。
> Info: [[yii\base\Model]] はデータベース・テーブルと関連*しない*モデル・クラスの親として使われます。
データベース・テーブルと対応するモデル・クラスでは、通常は [[yii\db\ActiveRecord]] が親になります。
@ -114,7 +116,8 @@ class SiteController extends Controller
アクションは最初に `EntryForm` オブジェクトを生成します。
次に、モデルに `$_POST` のデータ、Yii においては [[yii\web\Request::post()]] によって提供されるデータを投入しようと試みます。
モデルへのデータ投入が成功した場合(つまり、ユーザが HTML フォームを送信した場合)、アクションは[[yii\base\Model::validate()|validate()]] を呼んで、入力された値が有効なものであるかどうかを確認します。
モデルへのデータ投入が成功した場合(つまり、ユーザが HTML フォームを送信した場合)、アクションは[[yii\base\Model::validate()|validate()]] を呼んで、
入力された値が有効なものであるかどうかを確認します。
> Info: `Yii::$app` という式は [アプリケーション](structure-applications.md) インスタンスを表現します。
これはグローバルにアクセス可能なシングルトンです。
@ -122,10 +125,12 @@ class SiteController extends Controller
上記のコードでは、アプリケーション・インスタンスの `request` コンポーネントが `$_POST` データにアクセスするために使われています。
すべてが適正である場合、アクションは `entry-confirm` という名前のビューを表示して、データの送信が成功したことをユーザに確認させます。
データが送信されなかったり、データがエラーを含んでいたりする場合は、`entry` ビューが表示され、その中で HTML フォームが (もし有れば) 検証エラーのメッセージとともに表示されます。
データが送信されなかったり、データがエラーを含んでいたりする場合は、`entry` ビューが表示され、
その中で HTML フォームが (もし有れば) 検証エラーのメッセージとともに表示されます。
> Note: この簡単な例では、有効なデータ送信に対して単純に確認ページを表示しています。
実際の仕事では、[フォーム送信の諸問題](http://en.wikipedia.org/wiki/Post/Redirect/Get) を避けるために、[[yii\web\Controller::refresh()|refresh()]] または [[yii\web\Controller::redirect()|redirect()]] を使うことを考慮すべきです。
実際の仕事では、[フォーム送信の諸問題](http://en.wikipedia.org/wiki/Post/Redirect/Get) を避けるために、
[[yii\web\Controller::refresh()|refresh()]] または [[yii\web\Controller::redirect()|redirect()]] を使うことを考慮すべきです。
ビューを作成する <span id="creating-views"></span>
@ -168,7 +173,8 @@ use yii\widgets\ActiveForm;
<?php ActiveForm::end(); ?>
```
このビューは HTML フォームを構築するのに、[[yii\widgets\ActiveForm|ActiveForm]] と呼ばれる強力な [ウィジェット](structure-widgets.md) を使います。
このビューは HTML フォームを構築するのに、[[yii\widgets\ActiveForm|ActiveForm]] と呼ばれる強力な
[ウィジェット](structure-widgets.md) を使います。
ウィジェットの `begin()` メソッドと `end()` メソッドが、それぞれ、フォームの開始タグと終了タグをレンダリングします。
この二つのメソッドの呼び出しの間に、[[yii\widgets\ActiveForm::field()|field()]] メソッドによってインプット・フィールドが作成されます。
最初のインプット・フィールドは "name" のデータ、第二のインプット・フィールドは "email" のデータのためのものです。
@ -184,34 +190,38 @@ use yii\widgets\ActiveForm;
http://hostname/index.php?r=site%2Fentry
```
二つのインプット・フィールドを持つフォームを表示するページが表示されるでしょう。
それぞれのインプット・フィールドの前には、どんなデータを入力すべきかを示すラベルがあります。
二つのインプット・フィールドを持つフォームを表示するページが表示されるでしょう。それぞれのインプット・フィールドの前には、どんなデータを入力すべきかを示すラベルがあります。
何も入力せずに、あるいは、無効なメール・アドレスを入力して送信ボタンをクリックすると、それぞれ問題のあるインプット・フィールドの後ろにエラー・メッセージが表示されます。
![検証エラーのあるフォーム](images/start-form-validation.png)
有効な名前とメール・アドレスを入力してから送信ボタンをクリックすると、たった今入力したデータを表示する新しいページが表示されます。
有効な名前とメール・アドレスを入力してから送信ボタンをクリックすると、
たった今入力したデータを表示する新しいページが表示されます。
![データ入力の確認](images/start-entry-confirmation.png)
### 魔法の説明<span id="magic-explained"></span>
あなたは、舞台裏で HTML フォームがどのように動いているのか、不思議に思うかも知れません。
なぜなら、フォームが、ほとんど魔法のように、各インプット・フィールドのラベルを表示し、データを正しく入力しなかった場合には、ページをリロードすることなく、エラー・メッセージを表示するからです。
なぜなら、フォームが、ほとんど魔法のように、各インプット・フィールドのラベルを表示し、データを正しく入力しなかった場合には、
ページをリロードすることなく、エラー・メッセージを表示するからです。
そう、データの検証は、最初に JavaScript を使ってクライアント・サイドで実行され、次に PHP によってサーバ・サイドで実行されます。
[[yii\widgets\ActiveForm]] は、賢いことに、`EntryForm` で宣言した検証規則を抽出し、それを実行可能な JavaScript コードに変換して、JavaScript を使ってデータ検証を実行します。
[[yii\widgets\ActiveForm]] は、賢いことに、`EntryForm` で宣言した検証規則を抽出し、それを実行可能な JavaScript コードに変換して、
JavaScript を使ってデータ検証を実行します。
ブラウザで JavaScript を無効にした場合でも、`actionEntry()` メソッドで示されているように、サーバ・サイドでの検証は引き続き実行されます。
これにより、どのような状況であっても、データの有効性が保証されます。
> Warning: クライアント・サイドの検証は、ユーザにとってのより良い使い心地のために利便性を提供するものです。
クライアント・サイドの検証の有無にかかわらず、サーバ・サイドの検証は常に必要とされます。
クライアント・サイドの検証の有無にかかわらず、サーバ・サイドの検証は常に必要す。
インプット・フィールドのラベルは、モデルのプロパティ名を使用して、`field()` メソッドによって生成されます。
例えば、`name` というプロパティから `Name` というラベルが生成されます。
ビューの中で、下記のコードのように、ラベルをカスタマイズすることも出来ます。
ビューの中で、下記のコードのように、
ラベルをカスタマイズすることも出来ます。
```php
<?= $form->field($model, 'name')->label('お名前') ?>
@ -220,14 +230,14 @@ http://hostname/index.php?r=site%2Fentry
> Info: Yii はこのようなウィジェットを数多く提供して、複雑で動的なビューを素速く作成することを手助けしてくれます。
後で学ぶように、新しいウィジェットを書くことも非常に簡単です。
あなたは、将来のビュー開発を単純化するために、多くのビューコードを再利用可能なウィジェットに変換したいと思うことでしょう。
あなたは、将来のビュー開発を単純化するために、多くのビューコードを再利用可能なウィジェットに変換したいと思うことでしょう。
まとめ <span id="summary"></span>
------
ガイドのこのセクションにおいては、MVC アーキテクチャパターンの全ての部分に触れました。
そして、ユーザデータを表現し、当該データを検証するモデル・クラスを作成する方法を学びました。
ガイドのこのセクションにおいては、MVC アーキテクチャパターンの全ての部分に触れました。
そして、ユーザデータを表現し、当該データを検証するモデル・クラスを作成する方法を学びました。
また、ユーザからデータを取得する方法と、ブラウザにデータを表示して返す方法も学びました。
この作業は、アプリケーションを開発するときに、多大な時間を必要とするものになり得るものです。

44
docs/guide-ja/start-gii.md

@ -1,13 +1,13 @@
Gii でコードを生成する
======================
このセクションでは、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) を使って、ウェブ・サイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。
このセクションでは、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) を使って、ウェブ・サイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。
Gii を使ってコードを自動生成することは、Gii のウェブ・ページに表示される指示に対して正しい情報を入力するだけのことです。
このチュートリアルを通じて、次のことを学びます。
* アプリケーションで Gii を有効にする方法
* Gii を使って、アクティブレコードのクラスを生成する方法
* Gii を使って、アクティブレコードのクラスを生成する方法
* Gii を使って、DB テーブルの CRUD 操作を実装するコードを生成する方法
* Gii によって生成されるコードをカスタマイズする方法
@ -15,9 +15,8 @@ Gii を使ってコードを自動生成することは、Gii のウェブ・ペ
Gii を開始する <span id="starting-gii"></span>
--------------
[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) は Yii の [モジュール](structure-modules.md) として提供されています。
Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。
アプリケーションを生成した仕方にもよりますが、`config/web.php` の構成情報ファイルの中に、多分、下記のコードが既に提供されているでしょう。
[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) は Yii の [モジュール](structure-modules.md) として提供されています。
Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。アプリケーションを生成した仕方にもよりますが、`config/web.php` の構成情報ファイルの中に、多分、下記のコードが既に提供されているでしょう。
```php
$config = [ ... ];
@ -30,7 +29,8 @@ if (YII_ENV_DEV) {
}
```
上記の構成情報は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは `gii` という名前のモジュールをインクルードすべきこと、そして `gii` は [[yii\gii\Module]] というクラスであることを記述しています。
上記の構成情報は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは `gii` という名前のモジュールをインクルードすべきこと、
そして `gii` は [[yii\gii\Module]] というクラスであることを記述しています。
アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) である `web/index.php` をチェックすると、次の行があることに気付くでしょう。
これは本質的には `YII_ENV_DEV``true` に設定するものです。
@ -39,8 +39,7 @@ if (YII_ENV_DEV) {
defined('YII_ENV') or define('YII_ENV', 'dev');
```
この行のおかげで、アプリケーションは開発モードになっており、上記の構成情報によって、Gii が既に有効になっています。
これで、下記の URL によって Gii にアクセスすることが出来ます。
この行のおかげで、アプリケーションは開発モードになっており、上記の構成情報によって、Gii が既に有効になっています。これで、下記の URL によって Gii にアクセスすることが出来ます。
```
http://hostname/index.php?r=gii
@ -59,28 +58,25 @@ http://hostname/index.php?r=gii
![Gii](images/start-gii.png)
アクティブレコードのクラスを生成する <span id="generating-ar"></span>
アクティブレコードのクラスを生成する <span id="generating-ar"></span>
------------------------------------
Gii を使ってアクティブレコードのクラスを生成するためには、"Model Generator" を選びます
(Gii のインデックス・ページのリンクをクリックして下さい)。
そして、次のようにフォームに入力します。
Gii を使ってアクティブ・レコードのクラスを生成するためには、"Model Generator" を選びます (Gii のインデックス・ページのリンクをクリックして下さい)。そして、次のようにフォームに入力します。
* Table Name: `country`
* Model Class: `Country`
![Model Generator](images/start-gii-model.png)
次に、"Preview" ボタンをクリックします。
そうすると、結果として作成されるクラス・ファイルのリストに `models/Country.php` が挙ってきます。
クラス・ファイルの名前をクリックすると、内容をプレビューすることが出来ます。
次に、"Preview" ボタンをクリックします。そうすると、結果として作成されるクラス・ファイルのリストに `models/Country.php` が挙ってきます。クラス・ファイルの名前をクリックすると、内容をプレビューすることが出来ます。
Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、ファイル名の隣の `diff` ボタンをクリックして、生成されようとしているコードと既存のバージョンの違いを見てください。
Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、
ファイル名の隣の `diff` ボタンをクリックして、
生成されようとしているコードと既存のバージョンの違いを見てください。
![Model Generator のプレビュー](images/start-gii-model-preview.png)
既存のファイルを上書きするときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。
新しいファイルを作成するときは、単に "Generate" をクリックすれば十分です。
既存のファイルを上書きするときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。新しいファイルを作成するときは、単に "Generate" をクリックすれば十分です。
次に、コードの生成が成功したことを示す確認ページが表示されます。
既存のファイルがあった場合は、それが新しく生成されたコードで上書きされたことを示すメッセージも同じく表示されます。
@ -89,9 +85,7 @@ Gii を使うときに、既に同じファイルを作成していて、それ
CRUD コードを生成する <span id="generating-crud"></span>
---------------------
CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、ほとんどのウェブ・サイトでデータを扱うときによく用いられる4つのタスクを表しています。
Gii を使って CRUD 機能を作成するためには、"CRUD Generator" を選びます (Gii のインデックス・ページのリンクをクリックしてください) 。
「国リスト」のサンプルのためには、表示されたフォームに以下のように入力します。
CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、ほとんどのウェブ・サイトでデータを扱うときによく用いられる4つのタスクを表しています。Gii を使って CRUD 機能を作成するためには、"CRUD Generator" を選びます (Gii のインデックス・ページのリンクをクリックしてください) 。「国リスト」のサンプルのためには、表示されたフォームに以下のように入力します。
* Model Class: `app\models\Country`
* Search Model Class: `app\models\CountrySearch`
@ -99,8 +93,7 @@ Gii を使って CRUD 機能を作成するためには、"CRUD Generator" を
![CRUD Generator](images/start-gii-crud.png)
次に、"Preview" ボタンをクリックします。
生成されるファイルのリストは、次のようになります。
次に、"Preview" ボタンをクリックします。生成されるファイルのリストは、次のようになります。
![CRUD Generator のプレビュー](images/start-gii-crud-preview.png)
@ -136,10 +129,11 @@ http://hostname/index.php?r=country%2Findex
> Info: Gii は非常にカスタマイズしやすく拡張しやすいコード生成ツールとして設計されています。
これを賢く使うと、アプリケーションの開発速度を大いに高めることが出来ます。
詳細については、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) のセクションを参照してください。
詳細については、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) のセクションを参照してください。
まとめ <span id="summary"></span>
------
このセクションでは、Gii を使ってコードを生成して、データベース・テーブルに保存されているコンテントのための完全な CRUD 機能を実装する方法を学びました。
このセクションでは、Gii を使ってコードを生成して、データベース・テーブルに保存されているコンテントのための
完全な CRUD 機能を実装する方法を学びました。

37
docs/guide-ja/start-hello.md

@ -2,7 +2,8 @@
==================
このセクションでは、アプリケーションに「こんにちは」という新しいページを作成する方法を説明します。
この目的を達するために、[アクション](structure-controllers.md#creating-actions) と [ビュー](structure-views.md) を作成します。
この目的を達するために、[アクション](structure-controllers.md#creating-actions) と
[ビュー](structure-views.md) を作成します。
* アプリケーションは、このページへのリクエストをそのアクションに送付します。
* 次にそのアクションが「こんにちは」という言葉をエンド・ユーザに示すビューを表示します。
@ -17,7 +18,8 @@
アクションを作成する <span id="creating-action"></span>
--------------------
「こんにちは」のタスクのために、リクエストから `message` パラメータを読んで、そのメッセージをユーザに表示して返す `say` [アクション](structure-controllers.md#creating-actions) を作ります。
「こんにちは」のタスクのために、リクエストから `message` パラメータを読んで、そのメッセージをユーザに表示して返す
`say` [アクション](structure-controllers.md#creating-actions) を作ります。
リクエストが `message` パラメータを提供しなかった場合は、アクションはデフォルト値として "こんにちは" というメッセージを表示するものとします。
> Info: [アクション](structure-controllers.md#creating-actions) は、エンド・ユーザが直接に参照して実行できるオブジェクトです。
@ -26,8 +28,7 @@
アクションは [コントローラ](structure-controllers.md) の中で宣言されなければなりません。
話を簡単にするために、`say` アクションを既存の `SiteController` の中で宣言しましょう。
このコントローラは `controllers/SiteController.php` というクラス・ファイルの中で定義されています。
次のようにして、新しいアクションが始まります。
このコントローラは `controllers/SiteController.php` というクラス・ファイルの中で定義されています。次のようにして、新しいアクションが始まります。
```php
<?php
@ -48,7 +49,7 @@ class SiteController extends Controller
```
上記のコードでは、`SiteController` クラスの中で、`say` アクションが `actionSay` という名前のメソッドとして定義されています。
Yii はコントローラ・クラスの中で、アクションのメソッドとアクションでないメソッドを区別するために、`action` という接頭辞を使います。
Yii はコントローラ・クラスの中で、アクション・メソッドと非アクション・メソッドを区別するために、`action` という接頭辞を使います。
`action` という接頭辞の後に続く名前がアクション ID にマップされます。
アクションを命名するについては、Yii がアクション ID をどのように取り扱うかを知っていなければなりません。
@ -59,7 +60,8 @@ Yii はコントローラ・クラスの中で、アクションのメソッド
私たちの例では、アクション・メソッドは `$message` というパラメータを取り、そのデフォルト値は `"こんにちは"` です
(PHP で関数やメソッドの引数にデフォルト値を設定するのと全く同じ方法です)。
アプリケーションがリクエストを受け取って、当該リクエストの処理を `say` アクションが担当すべきであると決定した場合は、リクエストの中に見つかった同じ名前のパラメータの値をこの `$message` パラメータに代入します。
アプリケーションがリクエストを受け取って、当該リクエストの処理を `say` アクションが担当すべきであると決定した場合は、
リクエストの中に見つかった同じ名前のパラメータの値をこの `$message` パラメータに代入します。
言い換えれば、もしリクエストの中に `"さようなら"` という値の `message` パラメータが入っていれば、アクションの `$message` 変数にその値が割り当てられます。
アクション・メソッドの中では、[[yii\web\Controller::render()|render()]] が呼ばれて `say` と言う名前の [ビュー](structure-views.md) ファイルがレンダリングされます。
@ -85,13 +87,13 @@ use yii\helpers\Html;
アクションの中で [[yii\web\Controller::render()|render()]] メソッドが呼ばれるとき、`render()` メソッドは `views/ControllerID/ViewName.php` という名前の PHP ファイルを探します。
上記のコードで `message` パラメータが出力される前に [[yii\helpers\Html::encode()|HTML-エンコード]] されていることに注意してください。
パラメータはエンド・ユーザから来るものであり、悪意のある JavaScript コードを埋め込まれて [クロス・サイト・スクリプティング (XSS) 攻撃](http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) に使われうるものですから、脆弱性を防止するためにこうすることが必要です。
パラメータはエンド・ユーザから来るものであり、悪意のある JavaScript コードを埋め込まれて
[クロス・サイト・スクリプティング (XSS) 攻撃](http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) に使われうるものですから、
脆弱性を防止するためにこうすることが必要です。
当然ながら、`say` ビューにはもっと多くのコンテントを入れても構いません。
コンテントには、HTML タグ、平文テキスト、さらには PHP 文を含めることが出来ます。
当然ながら、`say` ビューにはもっと多くのコンテントを入れても構いません。コンテントには、HTML タグ、平文テキスト、さらには PHP 文を含めることが出来ます。
実際、`say` ビューは [[yii\web\Controller::render()|render()]] メソッドによって実行される PHP スクリプトであるに過ぎません。
ビュー・スクリプトによって出力されたコンテントはレスポンス結果としてアプリケーションに返されます。
そしてアプリケーションがこの結果をエンド・ユーザに対して出力します。
ビュー・スクリプトによって出力されたコンテントはレスポンス結果としてアプリケーションに返されます。そしてアプリケーションがこの結果をエンド・ユーザに対して出力します。
試してみる <span id="trying-it-out"></span>
@ -105,13 +107,13 @@ http://hostname/index.php?r=site%2Fsay&message=Hello+World
![Hello World](images/start-hello-world.png)
この URL は、結果として、"Hello World" を表示するページになります。
このページはアプリケーションの他のページと同じヘッダとフッタを共有しています。
この URL は、結果として、"Hello World" を表示するページになります。このページはアプリケーションの他のページと同じヘッダとフッタを共有しています。
URL から `message` パラメータを省略すると、"こんにちは" を表示するページを見ることになるでしょう。
これは、`message` が `actionSay()` メソッドにパラメータとして渡されるものであり、それが省略された場合には、デフォルト値である `"こんにちは"` が代りに使われるからです。
> Info: 新しいページは他のページと同じヘッダとフッタを共有していますが、それは [[yii\web\Controller::render()|render()]] メソッドが `say` ビューの結果をいわゆる [レイアウト](structure-views.md#layouts) に自動的に埋め込むからです。
> Info: 新しいページは他のページと同じヘッダとフッタを共有していますが、それは [[yii\web\Controller::render()|render()]] メソッドが `say` ビューの結果を
いわゆる [レイアウト](structure-views.md#layouts) に自動的に埋め込むからです。
レイアウトは、この場合、`views/layouts/main.php` にあります。
上記の URL の `r` パラメータについては、さらに説明が必要でしょう。
@ -122,10 +124,10 @@ URL から `message` パラメータを省略すると、"こんにちは" を
この例で言えば、`site/say` というルートは、`SiteController` コントローラ・クラスと `say` アクションとして解決されます。
結果として、`SiteController::actionSay()` メソッドがリクエストを処理するために呼び出されます。
> Info: アクションと同じく、コントローラもまたアプリケーションの中で一意に定義される ID を持ちます。
コントローラ ID も、アクション ID と同じ命名規則を使います。
コントローラ・クラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、結果として出来る文字列に `Controller` という接尾辞を追加したものとなります。
コントローラ・クラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、
結果として出来る文字列に `Controller` という接尾辞を追加したものとなります。
例えば、`post-comment` というコントローラ ID に対応するコントローラ・クラスの名前は `PostCommentController` です。
@ -133,8 +135,7 @@ URL から `message` パラメータを省略すると、"こんにちは" を
------
このセクションでは、MVC アーキテクチャ・パターンのうちのコントローラとビューの部分に触れました。
特定のリクエストを処理するためのアクションをコントローラの一部として作成しました。
また、レスポンスのコンテントを作成するためのビューも作成しました。
特定のリクエストを処理するためのアクションをコントローラの一部として作成しました。また、レスポンスのコンテントを作成するためのビューも作成しました。
この単純な例においては、使用される唯一のデータが `message` パラメータであったため、モデルは関係していません。
また、Yii におけるルートについても学びました。ルートはユーザのリクエストとコントローラのアクションとの橋渡しとして働くものです。

106
docs/guide-ja/start-installation.md

@ -6,10 +6,10 @@ Yii は二つの方法でインストールすることが出来ます。すな
Yii の標準的なインストールを実行すると、フレームワークとプロジェクト・テンプレートの両方がダウンロードされてインストールされます。
プロジェクト・テンプレートは、いくつかの基本的な機能、例えば、ログインやコンタクト・フォームなどを実装した、動作する Yii アプリケーションです。
そのコードは推奨される方法に従って編成されています。
そのため、プロジェクト・テンプレートは、あなたのプロジェクトのための良い開始点としての役割を果たしうるものです。
そのコードは推奨される方法に従って編成されています。そのため、プロジェクト・テンプレートは、あなたのプロジェクトのための良い開始点としての役割を果たしうるものです。
ここから続くいくつかのセクションにおいては、いわゆる *ベーシック・プロジェクト・テンプレート* とともに Yii をインストールする方法、および、このテンプレート上に新しい機能を実装する方法を説明します。
ここから続くいくつかのセクションにおいては、いわゆる *ベーシック・プロジェクト・テンプレート* とともに Yii をインストールする方法、
および、このテンプレートの上に新しい機能を実装する方法を説明します。
Yii はもう一つ、[アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) と呼ばれるテンプレートも提供しています。
こちらは、チーム開発環境において多層構造のアプリケーションを開発するときに使用する方が望ましいものです。
@ -23,7 +23,7 @@ Composer によるインストール <span id="installing-via-composer"></span>
### Composer をインストールする
まだ Composer をインストールしていない場合は、[getcomposer.org]() の指示に従ってインストールすることが出来ます。
まだ Composer をインストールしていない場合は、[getcomposer.org](https://getcomposer.org/download/) の指示に従ってインストールすることが出来ます。
Linux や Mac OS X では、次のコマンドを実行します。
```bash
@ -33,10 +33,13 @@ mv composer.phar /usr/local/bin/composer
Windows では、[Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe) をダウンロードして実行します。
何か問題が生じたときは、[Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md) を参照してください。
Composer は初めてだという場合は、少なくとも、Composer ドキュメントの [基本的な使い方のセクション](https://getcomposer.org/doc/01-basic-usage.md) も参照することを推奨します。
何か問題が生じたときは、[Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md)
を参照してください。
Composer は初めてだという場合は、少なくとも、Composer ドキュメントの [基本的な使い方のセクション](https://getcomposer.org/doc/01-basic-usage.md)
も参照することを推奨します。
このガイドでは、composer のコマンドの全ては、あなたが composer を [グローバル](https://getcomposer.org/doc/00-intro.md#globally) にインストールし、`composer` コマンドとして使用できるようにしているものと想定しています。
このガイドでは、composer のコマンドの全ては、あなたが composer を [グローバル](https://getcomposer.org/doc/00-intro.md#globally) にインストールし、
`composer` コマンドとして使用できるようにしているものと想定しています。
そうではなく、ローカル・ディレクトリにある `composer.phar` を使おうとする場合は、例に出てくるコマンドをそれに合せて修正しなければなりません。
以前に Composer をインストールしたことがある場合は、確実に最新のバージョンを使うようにしてください。
@ -44,7 +47,7 @@ Composer は `composer self-update` コマンドを実行してアップデー
> Note: Yii のインストールを実行する際に、Composer は大量の情報を Github API から要求する必要が生じます。
> リクエストの数は、あなたのアプリケーションが持つ依存の数によりますが、**Github API レート制限** より大きくなることがあり得ます。
> この制限にかかった場合、Composer は Github API トークンを取得するために、あなたの Github ログイン認証情報を要求するでしょう。
> この制限にかかった場合、Composer は Github API アクセス・トークンを取得するために、あなたの Github ログイン認証情報を要求するでしょう。
> 高速な接続においては、Composer が対処できるよりも早い段階でこの制限にかかることもありますので、
> Yii のインストールの前に、このアクセス・トークンを構成することを推奨します。
> アクセス・トークンの構成の仕方については、[Github API トークンに関する Composer ドキュメント](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens)
@ -52,26 +55,23 @@ Composer は `composer self-update` コマンドを実行してアップデー
### Yii をインストールする <span id="installing-from-composer"></span>
Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます。
Composer がインストールされたら、ウェブ・アクセス可能なフォルダで下記のコマンドを実行することによって
Yii アプリケーション・テンプレートをインストールすることが出来ます。
```bash
composer global require "fxp/composer-asset-plugin:~1.3.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
```
最初のコマンドは [composer アセット・プラグイン](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。
これにより、Composer を通じて bower と npm の依存パッケージを管理することが出来るようになります。
このコマンドは一度だけ実行すれば十分です。
第二のコマンドは `basic` という名前のディレクトリに Yii の最新の安定版をインストールします。
このコマンドが `basic` という名前のディレクトリに Yii アプリケーション/テンプレートの最新の安定版をインストールします。
必要なら別のディレクトリ名を選ぶことも出来ます。
> Info: `composer create-project` コマンドが失敗するときは、composer asset plugin が正しくインストール出来ているかどうかを確認して下さい。
> `composer global show` を実行することで確認することが出来ます。このコマンドの出力に `fxp/composer-asset-plugin` のエントリが含まれていなければなりません。.
> よくあるエラーについては、[Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md)
> も参照して下さい。
> エラーを修正した後は、`basic` ディレクトリの中で `composer update` を実行して、中断されたインストールを再開することが出来ます。
> Info: `composer create-project` コマンドが失敗するときは、
> よくあるエラーについて [Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md) を参照して下さい。
> エラーを修正した後は、`basic` ディレクトリの中で `composer update` を実行して、
> 中断されたインストールを再開することが出来ます。
> Tip: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) を追加した次のコマンドを代りに使うことが出来ます。
> Tip: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability)
> を追加した次のコマンドを代りに使うことが出来ます。
>
> ```bash
> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
@ -85,9 +85,9 @@ composer create-project --prefer-dist yiisoft/yii2-app-basic basic
アーカイブ・ファイルから Yii をインストールするには、三つの手順を踏みます。
1. [yiiframework.com](http://www.yiiframework.com/download/) からアーカイブ・ファイルをダウンロードす
2. ダウンロードしたファイルをウェブからアクセスできるフォルダーに展開する
3. `config/web.php` ファイルを編集して、`cookieValidationKey` という構成情報の項目に秘密キーを入力す
1. [yiiframework.com](http://www.yiiframework.com/download/) からアーカイブ・ファイルをダウンロードします。
2. ダウンロードしたファイルをウェブ・アクセス可能なフォルダに展開します
3. `config/web.php` ファイルを編集して、`cookieValidationKey` という構成情報の項目に秘密キーを入力しま
(Composer を使って Yii をインストールするときは、これは自動的に実行されます)。
```php
@ -105,17 +105,17 @@ composer create-project --prefer-dist yiisoft/yii2-app-basic basic
しかし、他のインストール・オプションも利用可能です。
* コアフレームワークだけをインストールし、アプリケーション全体を一から構築したい場合は、[アプリケーションを一から構築する](tutorial-start-from-scratch.md)
* コアフレームワークだけをインストールし、アプリケーション全体を一から構築したい場合は、[アプリケーションを一から構築する](tutorial-start-from-scratch.md)
で説明されている指示に従うことが出来ます。
* もっと洗練された、チーム開発環境により適したアプリケーションから開始したい場合は、 [アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) をインストールすることを考慮することが出来ます。
* もっと洗練された、チーム開発環境により適したアプリケーションから開始したい場合は、
[アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) をインストールすることを考慮することが出来ます。
アセットをインストールする <span id="installing-assets"></span>
--------------------------
Yii は、アセット (CSS および JavaScript) ライブラリのインストールについて
[Bower](http://bower.io/) および/または [NPM](https://www.npmjs.org/) のパッケージに依存しています。
Yii はこれらのライブラリを取得するのに Composer を使って、PHP と CSS/JavaScript のパッケージバージョンを同時に解決できるようにしています。
Yii は、アセット (CSS および JavaScript) ライブラリのインストールについて [Bower](http://bower.io/) および/または [NPM](https://www.npmjs.org/) のパッケージに依存しています。
Yii はこれらのライブラリを取得するのに Composer を使って、PHP と CSS/JavaScript のパッケージ・バージョンを同時に解決できるようにしています。
このことは、[asset-packagist.org](https://asset-packagist.org) または [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) を使用することによって達成されます。
詳細は [アセットのドキュメント](structure-assets.md) を参照して下さい。
@ -131,15 +131,14 @@ Composer によるアセットのインストールを抑止するためには
},
```
> Note: Composer によるアセットのインストールをバイパスする場合は、アセットのインストールとバージョン衝突の解決について
> あなたが責任を持たなければなりません。
> Note: Composer によるアセットのインストールをバイパスする場合は、アセットのインストールとバージョン衝突の解決についてあなたが責任を持たなければなりません。
> さまざまなエクステンションに由来するアセット・ファイル間で不整合が生じうることを覚悟して下さい。
インストールを検証する <span id="verifying-installation"></span>
----------------------
インストール完了後、あなたのウェブ・サーバを構成してください (次のを参照してください)。
インストール完了後、あなたのウェブ・サーバを構成してください (次のセクションを参照してください)。
あるいは、プロジェクトの `web` ディレクトリで次のコマンドを実行して、
[PHP の内蔵ウェブ・サーバ](https://secure.php.net/manual/ja/features.commandline.webserver.php) を使ってください。
@ -147,9 +146,8 @@ Composer によるアセットのインストールを抑止するためには
php yii serve
```
> Note: デフォルトでは、この HTTP サーバは 8080 ポートをリスンします。
しかし、このポートがすでに使われていたり、複数のアプリケーションをこの方法で動かしたい場合は、どのポートを使うかを指定したいと思うでしょう。
単に --port 引数を追加して下さい。
> Note: デフォルトでは、この HTTP サーバは 8080 ポートをリスンします。しかし、このポートがすでに使われていたり、複数のアプリケーションをこの方法で動かしたい場合は、
どのポートを使うかを指定したいと思うでしょう。単に --port 引数を追加して下さい。
```bash
php yii serve --port=8888
@ -163,11 +161,10 @@ http://localhost:8080/
![Yii のインストールが成功](images/start-app-installed.png)
ブラウザに上のような "おめでとう!" のページが表示されるはずです。
もし表示されなかったら、PHP のインストールが Yii の必要条件を満たしているかどうか、チェックしてください。
ブラウザに上のような "おめでとう!" のページが表示されるはずです。もし表示されなかったら、PHP のインストールが Yii の必要条件を満たしているかどうか、チェックしてください。
最低限の必要条件を満たしているかどうかは、次の方法のどちらかによってチェックすることが出来ます。
* `requirements.php``/web/requirements.php` としてコピーし、ブラウザを使って URL `http://localhost/requirements.php` にアクセスする。
* `/requirements.php``/web/requirements.php` としてコピーし、ブラウザを使って URL `http://localhost/requirements.php` にアクセスする。
* 次のコマンドを実行する。
```bash
@ -177,29 +174,37 @@ http://localhost:8080/
Yii の最低必要条件を満たすように PHP のインストールを構成しなければなりません。
最も重要なことは、PHP 5.4 以上でなければならないということです。最新の PHP 7 なら理想的です。
また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベースドライバ (MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。
また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベースドライバ (MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。
ウェブ・サーバを構成する <span id="configuring-web-servers"></span>
------------------------
> Info: もし Yii の試運転をしているだけで、本番サーバに配備する意図がないのであれば、当面、この項は飛ばしても構いません。
> Info: もし Yii の試運転をしているだけで、本番サーバに配備する意図がないのであれば、
当面、この項は飛ばしても構いません。
上記の説明に従ってインストールされたアプリケーションは、[Apache HTTP サーバ](http://httpd.apache.org/) と [Nginx HTTP サーバ](http://nginx.org/) のどちらでも、また、Windows、Mac OS X、Linux のどれでも、PHP 5.4 以上を走らせている環境であれば、そのままの状態で動作するはずです。
上記の説明に従ってインストールされたアプリケーションは、[Apache HTTP サーバ](http://httpd.apache.org/)
と [Nginx HTTP サーバ](http://nginx.org/) のどちらでも、また、Windows、Mac OS X、Linux のどれでも、
PHP 5.4 以上を走らせている環境であれば、そのままの状態で動作するはずです。
Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性があります。
ただし HHVM がネイティブの PHP とは異なる振舞いをする特殊なケースもいくつかありますので、HHVM を使うときはいくらか余分に注意を払う必要があります。
本番用のサーバでは、`http://www.example.com/basic/web/index.php` の代りに `http://www.example.com/index.php` という URL でアプリケーションにアクセス出来るようにウェブ・サーバを設定したいでしょう。
そういう設定をするためには、ウェブ・サーバのドキュメントルートを `basic/web` フォルダに向けることが必要になります。
本番用のサーバでは、`http://www.example.com/basic/web/index.php` の代りに `http://www.example.com/index.php` という
URL でアプリケーションにアクセス出来るようにウェブ・サーバを設定したいでしょう。
そういう設定をするためには、ウェブ・サーバのドキュメント・ルートを `basic/web` フォルダに向けることが必要になります。
また、[ルーティングと URL 生成](runtime-routing.md) のセクションで述べられているように、URL から `index.php` を隠したいとも思うでしょう。
このセクションでは、これらの目的を達するために Apache または Nginx サーバをどのように設定すれば良いかを学びます。
このでは、これらの目的を達するために Apache または Nginx サーバをどのように設定すれば良いかを学びます。
> Info: `basic/web` をドキュメント・ルートに設定することは、`basic/web` の兄弟ディレクトリに保存されたプライベートなアプリケーション・コードや公開できないデータ・ファイルにエンド・ユーザがアクセスすることを防止することにもなります。
> Info: `basic/web` をドキュメント・ルートに設定することは、`basic/web` の兄弟ディレクトリに保存されたプライベートなアプリケーション・コードや
公開できないデータ・ファイルにエンド・ユーザがアクセスすることを防止することにもなります。
`basic/web` 以外のフォルダに対するアクセスを拒否することはセキュリティ強化の一つです。
> Info: あなたがウェブ・サーバの設定を修正する権限を持たない共用ホスティング環境でアプリケーションが走る場合であっても、セキュリティ強化のためにアプリケーションの構造を調整することがまだ出来ます。
> Info: あなたがウェブ・サーバの設定を修正する権限を持たない共用ホスティング環境でアプリケーションが走る場合であっても、
セキュリティ強化のためにアプリケーションの構造を調整することがまだ出来ます。
詳細については、[共有ホスティング環境](tutorial-shared-hosting.md) のセクションを参照してください。
> Info: あなたのアプリケーションをリバース・プロキシの背後で動かそうとする場合は、
> リクエスト・コンポーネントの [信頼できるプロキシとヘッダ](runtime-requests.md#trusted-proxies) を構成する必要があるかもしれません。
### 推奨される Apache の構成 <span id="recommended-apache-configuration"></span>
@ -207,7 +212,7 @@ Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性が
`path/to/basic/web` の部分を `basic/web` の実際のパスに置き換えなければならないことに注意してください。
```apache
# ドキュメントルートを "basic/web" に設定
# ドキュメントルートを "basic/web" に設定
DocumentRoot "path/to/basic/web"
<Directory "path/to/basic/web">
@ -219,6 +224,9 @@ DocumentRoot "path/to/basic/web"
# そうでなければ、リクエストを index.php に送付する
RewriteRule . index.php
# UrlManager の $showScriptName が false の場合は、スクリプト名で URL にアクセスすることを許さない
RewriteRule ^index.php/ - [L,R=404]
# ... 他の設定 ...
</Directory>
```
@ -275,6 +283,8 @@ server {
}
```
この構成を使う場合は、多数の不要な `stat()` システム・コールを避けるために、`php.ini` ファイルで `cgi.fix_pathinfo=0` を同時に設定しておくべきです。
この構成を使う場合は、多数の不要な `stat()` システム・コールを避けるために、
`php.ini` ファイルで `cgi.fix_pathinfo=0` を同時に設定しておくべきです。
また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、`fastcgi_param HTTPS on;` を追加しなければならないことにも注意を払ってください。
また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、
`fastcgi_param HTTPS on;` を追加しなければならないことにも注意を払ってください。

4
docs/guide-ja/start-looking-ahead.md

@ -3,7 +3,7 @@
「はじめよう」の章全体を読み通したなら、いまやあなたは、完全な Yii のアプリケーションを作成したことがある、ということになります。
その過程で、あなたは必要とされることが多いいくつかの機能、例えば、HTML フォームを通じてユーザからデータを取得することや、データベースからデータを取得すること、また、ページ付けをしてデータを表示することなどを実装する方法を学びました。
また、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) を使ってコードを自動的に生成する方法も学びました。
また、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) を使ってコードを自動的に生成する方法も学びました。
Gii をコード生成に使うと、ウェブ開発のプロセスの大部分が、いくつかのフォームに入力していくだけの簡単な仕事になります。
このセクションでは、Yii フレームワークを使うときの生産性を更に高めるために利用できるリソースについてまとめます。
@ -11,7 +11,7 @@ Gii をコード生成に使うと、ウェブ開発のプロセスの大部分
* ドキュメント
- [決定版ガイド](http://www.yiiframework.com/doc-2.0/guide-README.html):
名前が示すように、このガイドは Yii がどのように動作すべきものかを正確に記述し、Yii を使用するについての全般的な手引きを提供するものです。
これは唯一の最も重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前にあなたはこれを読まなければなりません
これは唯一の最も重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前にあなたが読まなければならないものです
- [クラス・リファレンス](http://www.yiiframework.com/doc-2.0/index.html):
これは Yii によって提供される全てのクラスの使用法を記述しています。
主として、コードを書いている時に、特定のクラス、メソッド、プロパティについて理解したい場合に読まれるべきものです。

16
docs/guide-ja/start-prerequisites.md

@ -5,19 +5,19 @@ Yii の学習曲線は他の PHP フレームワークほど急峻ではあり
## PHP
Yii は PHP フレームワークですから、必ず [言語リファレンスを読んで理解する](http://php.net/manual/ja/langref.php) ようにして下さい。
Yii を使って開発するときはオブジェクト指向でコードを書くことになりますから、必ず、
[クラスとオブジェクト](https://secure.php.net/manual/ja/language.oop5.basic.php) および [名前空間](https://secure.php.net/manual/ja/language.namespaces.php) には慣れ親しんでおいて下さい。
Yii を使って開発するときはオブジェクト指向の流儀でコードを書くことになりますから、必ず、[クラスとオブジェクト](https://secure.php.net/manual/ja/language.oop5.basic.php) および [名前空間](https://secure.php.net/manual/ja/language.namespaces.php) には慣れ親しんでおいて下さい。
## オブジェクト指向プログラミング
オブジェクト指向プログラミングの基礎的な理解が必要です。これに慣れていない場合は、利用できるチュートリアルが沢山ありますので、その中の一つをチェックして下さい。
例えば、[tuts+ の中の一つ](https://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762) など。
あなたのアプリケーションが複雑であればあるほど、その複雑性を管理するために、より高度な OOP 概念を学ぶ必要があることに留意して下さい。
あなたのアプリケーションが複雑であればあるほど、その複雑性をうまく管理するために、
より高度な OOP 概念を学ぶ必要があることに留意して下さい。
## コマンドラインと Composer
## コマンド・ラインと Composer
Yii は業界標準の PHP パッケージ管理ソフトである [Composer](https://getcomposer.org/) を広範囲に使用していますので、必ずその [ガイド](https://getcomposer.org/doc/01-basic-usage.md) を読んで理解して下さい。
あなたがコマンド・ラインの使用に慣れていないのであれば、今こそ使い始めてみるべき時です。
いったん基礎さえ学習してしまえば、二度とコマンド・ラインなしで仕事をしようとは思わなくなりますよ。
Yii は業界標準の PHP パッケージ管理ソフトである [Composer](https://getcomposer.org/) を広範囲に使用していますので、
必ずその [ガイド](https://getcomposer.org/doc/01-basic-usage.md) を読んで理解して下さい。
あなたがコマンドラインの使用に慣れていないのであれば、今こそ使い始めてみるべき時です。
いったん基礎を学習すれば、二度とコマンドラインなしで仕事をしようとは思わなくなりますよ。

35
docs/guide-ja/start-workflow.md

@ -3,38 +3,40 @@
Yii のインストールが終ると、実際に動く Yii のアプリケーションにアクセスすることが出来ます。
その URL は、`http://hostname/basic/web/index.php` あるいは `http://hostname/index.php` など、設定によって異なります。
このセクションでは、アプリケーションに組み込み済みの機能を紹介し、コードがどのように編成されているか、そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。
このセクションでは、アプリケーションに組み込み済みの機能を紹介し、コードがどのように編成されているか、
そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。
> Info: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、`basic/web` をウェブ・サーバのドキュメント・ルートとして設定したと仮定します。
> Info: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、`basic/web`
をウェブ・サーバのドキュメント・ルートとして設定したと仮定します。
そして、アプリケーションにアクセスするための URL は `http://hostname/index.php` またはそれに似たものになるように設定したと仮定します。
必要に応じて、説明の中の URL を読み替えてください。
フレームワークそのものとは異なり、プロジェクト・テンプレートはインストール後は完全にあなたのものであることに注意してください。
必要に応じてコードを追加したり削除したり、完全に書き換えたりするのはあなたの自由です。
機能 <span id="functionality"></span>
----
インストールされた基本的なアプリケーションは四つのページを持っています。
インストールされたベーシック・アプリケーションは四つのページを持っています。
* ホームページ: `http://hostname/index.php` の URL にアクセスすると表示されます。
* 「について」のページ。
* 「コンタクト」のページ: エンド・ユーザがメールであなたに連絡を取ることが出来るコンタクト・フォームが表示されます。
* 「ログイン」ページ: エンド・ユーザを認証するためのログイン・フォームが表示されます。
"admin/admin" でログインしてみてください。
「ログイン」のメイン・メニュー項目が「ログアウト」に変ることに気付くでしょう。
"admin/admin" でログインしてみてください。「ログイン」のメイン・メニュー項目が「ログアウト」に変ることに気付くでしょう。
これらのページは共通のヘッダとフッタを持っています。
ヘッダには、異なるページ間を行き来することを可能にするメイン・メニュー・バーがあります。
ブラウザのウィンドウの下部にツールバーがあることにも気がつくはずです。
これは Yii によって提供される便利な [デバッグ・ツール・バー](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) であり、たくさんのデバッグ情報、例えば、ログ・メッセージ、レスポンスのステータス、実行されたデータベース・クエリなどを記録して表示するものです。
これは Yii によって提供される便利な [デバッグ・ツール](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) であり、たくさんのデバッグ情報、例えば、ログ・メッセージ、レスポンスのステータス、実行されたデータベース・クエリなどを記録して表示するものです。
ウェブ・アプリケーションに加えて、`yii` というコンソール・スクリプトがアプリケーションのベース・ディレクトリにあります。
このスクリプトは、バックグラウンドのタスクまたはメンテナンスのタスクを実行するために使用することが出来ます。
これについては、[コンソール・アプリケーションのセクション](tutorial-console.md) で説明されています。
アプリケーションの構造 <span id="application-structure"></span>
----------------------
@ -52,7 +54,7 @@ basic/ アプリケーションのベース・パス
runtime/ 実行時に Yii によって生成されるファイル (ログやキャッシュなど) を格納
vendor/ インストールされた Composer パッケージ (Yii フレームワークそのものを含む) を格納
views/ ビュー・ファイルを格納
web/ アプリケーションのウェブ・ルート。ウェブからアクセス可能なファイルを格納
web/ アプリケーションのウェブ・ルート。ウェブアクセス可能なファイルを格納
assets/ Yii によって発行されるアセット・ファイル (javascript と CSS) を格納
index.php アプリケーションのエントリ・スクリプト (ブートストラップ・スクリプト)
yii Yii コンソール・コマンド実行スクリプト
@ -61,7 +63,8 @@ basic/ アプリケーションのベース・パス
一般に、アプリケーションのファイルは二種類に分けることが出来ます。すなわち、`basic/web` の下にあるファイルとその他のディレクトリの下にあるファイルです。
前者は HTTP で (すなわちブラウザで) 直接にアクセスすることが出来ますが、後者は直接のアクセスは出来ませんし、許可すべきでもありません。
Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) アーキテクチャ・パターンを実装していますが、それが上記のディレクトリ構成にも反映されています。
Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) アーキテクチャ・パターンを実装していますが、
それが上記のディレクトリ構成にも反映されています。
`models` ディレクトリが全ての [モデル・クラス](structure-models.md) を格納し、`views` ディレクトリが全ての [ビュー・スクリプト](structure-views.md) を格納し、
`controllers` ディレクトリが全ての [コントローラ・クラス](structure-controllers.md) を格納しています。
@ -70,22 +73,24 @@ Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/
![アプリケーションの静的な構造](images/application-structure.png)
各アプリケーションは一つのエントリ・スクリプト `web/index.php` を持ちます。
これはアプリケーション中で唯一ウェブからアクセス可能な PHP スクリプトです。
これはアプリケーション中で唯一ウェブアクセス可能な PHP スクリプトです。
エントリ・スクリプトは入力されたリクエストを受け取って、[アプリケーション](structure-applications.md) のインスタンスを作成します。
[アプリケーション](structure-applications.md) は [コンポーネント](concept-components.md) の助力を得てリクエストを解決し、リクエストを MVC に送付します。
[ウィジェット](structure-widgets.md) は、複雑で動的なユーザ・インタフェイス要素を構築するために、[ビュー](structure-views.md) の中で使われます。
リクエストのライフサイクル <span id="request-lifecycle"></span>
----------------------------
リクエストのライフサイクル <span id="request-lifecycle"></span>
--------------------------
次の図は、アプリケーションがどのようにリクエストを処理するかを示すものです。
![リクエストのライフサイクル](images/request-lifecycle.png)
![リクエストのライフサイクル](images/request-lifecycle.png)
1. ユーザが [エントリ・スクリプト](structure-entry-scripts.md) `web/index.php` に対してリクエストを出します。
2. エントリ・スクリプトはアプリケーションの [構成情報](concept-configurations.md) を読み出して、リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。
3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーション・コンポーネントの助力を得て、リクエストされた [ルート](runtime-routing.md) を解決します。
2. エントリ・スクリプトはアプリケーションの [構成情報](concept-configurations.md) を読み出して、
リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。
3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーション・コンポーネントの助力を得て、
リクエストされた [ルート](runtime-routing.md) を解決します。
4. アプリケーションがリクエストを処理する [コントローラ](structure-controllers.md) のインスタンスを作成します。
5. コントローラが [アクション](structure-controllers.md) のインスタンスを作成し、アクションのためのフィルタを実行します。
6. 一つでもフィルタが失敗したときは、アクションはキャンセルされます。

18
docs/guide-ja/structure-application-components.md

@ -2,8 +2,9 @@
================================
アプリケーションは [サービス・ロケータ](concept-service-locator.md) です。
アプリケーションは、リクエストを処理するためのいろいろなサービスを提供する一連のオブジェクト、いわゆる *アプリケーション・コンポーネント* をホストします。
例えば、`urlManager` がウェブ・リクエストを適切なコントローラにルーティングする役割を負い、`db` コンポーネントが DB 関連のサービスを提供する、等々です。
アプリケーションは、リクエストを処理するためのいろいろなサービスを提供する一組の *アプリケーション・コンポーネント* と呼ばれるものをホストします。
例えば、`urlManager` がウェブ・リクエストを適切なコントローラにルーティングする役割を負い、
`db` コンポーネントが DB 関連のサービスを提供する、等々です。
全てのアプリケーション・コンポーネントは、それぞれ、同一のアプリケーション内で他のアプリケーション・コンポーネントから区別できるように、ユニークな ID を持ちます。
アプリケーション・コンポーネントには、次の式によってアクセス出来ます。
@ -57,8 +58,7 @@
けれども、場合によっては、明示的にアクセスされないときでも、リクエストごとにアプリケーション・コンポーネントのインスタンスを作成したいことがあります。
そうするために、アプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストにそのコンポーネントの ID を挙げることが出来ます。
また、特別なコンポーネントをブートストラップするためにクロージャを用いることも出来ます。
インスタンス化されたコンポーネントを返すことは要求されません。
また、カスタマイズしたコンポーネントをブートストラップするためにクロージャを用いることも出来ます。インスタンス化されたコンポーネントを返すことは要求されません。
単に [[yii\base\Application]] のインスタンス化の後にコードを走らせるだけのためにクロージャを使うことも出来ます。
例えば、次のアプリケーション構成情報は、`log` コンポーネントが常にロードされることを保証するものです。
@ -87,9 +87,10 @@
## コア・アプリケーション・コンポーネント <span id="core-application-components"></span>
Yii は固定の ID とデフォルトの構成情報を持つ一連の *コア*・アプリケーション・コンポーネントを定義しています。
例えば、[[yii\web\Application::request|request]] コンポーネントは、ユーザ・リクエストに関する情報を収集して、それを [ルート](runtime-routing.md) として解決するために使用されます。
例えば、[[yii\web\Application::request|request]] コンポーネントは、ユーザ・リクエストに関する情報を収集して、
それを [ルート](runtime-routing.md) として解決するために使用されます。
また、[[yii\base\Application::db|db]] コンポーネントは、それを通じてデータ・ベースクエリを実行できるデータベース接続を表現します。
Yii のアプリケーションがユーザリクエストを処理出来るのは、まさにこれらのコア・アプリケーション・コンポーネントの助けがあってこそです。
Yii のアプリケーションがユーザリクエストを処理出来るのは、まさにこれらのコア・アプリケーション・コンポーネントの助けがあってこそです。
下記が事前に定義されたコア・アプリケーション・コンポーネントです。
通常のアプリケーション・コンポーネントに対するのと同様に、これらを構成し、カスタマイズすることが出来ます。
@ -98,8 +99,9 @@ Yii のアプリケーションがユーザリクエストを処理出来るの
* [[yii\web\AssetManager|assetManager]]: アセット・バンドルとアセットの発行を管理します。
詳細は [アセット](structure-assets.md) のセクションを参照してください。
* [[yii\db\Connection|db]]: データベース接続を表します。これを通じて、DB クエリを実行することが出来ます。
このコンポーネントを構成するときは、コンポーネントのクラスはもちろん、[[yii\db\Connection::dsn]] のような必須のコンポーネント・プロパティを指定しなければならないことに注意してください。
詳細は [データアクセス・オブジェクト](db-dao.md) のセクションを参照してください。
このコンポーネントを構成するときは、コンポーネントのクラスはもちろん、[[yii\db\Connection::dsn]]
のような必須のコンポーネント・プロパティを指定しなければならないことに注意してください。
詳細は [データベース・アクセス・オブジェクト](db-dao.md) のセクションを参照してください。
* [[yii\base\Application::errorHandler|errorHandler]]: PHP のエラーと例外を処理します。
詳細は [エラー処理](runtime-handling-errors.md) のセクションを参照してください。
* [[yii\i18n\Formatter|formatter]]: エンド・ユーザに表示されるデータに書式を設定します。

148
docs/guide-ja/structure-applications.md

@ -1,19 +1,22 @@
アプリケーション
================
アプリケーションは Yii アプリケーション・システム全体の構造とライフサイクルを統制するオブジェクトです。
アプリケーションは Yii アプリケーション・システム全体の構造とライフサイクルを統制するオブジェクトです。
全ての Yii アプリケーション・システムは、それぞれ、単一のアプリケーション・オブジェクトを持ちます。
アプリケーション・オブジェクトは、[エントリ・スクリプト](structure-entry-scripts.md) において作成され、`\Yii::$app` という式でグローバルにアクセスすることが出来るオブジェクトです。
> Info: ガイドの中で「アプリケーション」という言葉は、文脈に応じて、アプリケーション・オブジェクトを意味したり、アプリケーション・システムを意味したりします。
> Info: ガイドの中で「アプリケーション」という言葉は、文脈に応じて、アプリケーション・オブジェクトを意味したり、
アプリケーション・システムを意味したりします。
二種類のアプリケーション、すなわち、[[yii\web\Application|ウェブ・アプリケーション]] と [[yii\console\Application|コンソール・アプリケーション]] があります。
二種類のアプリケーション、すなわち、[[yii\web\Application|ウェブ・アプリケーション]] と
[[yii\console\Application|コンソール・アプリケーション]] があります。
名前が示すように、前者は主にウェブのリクエストを処理し、後者はコンソール・コマンドのリクエストを処理します。
## アプリケーションの構成情報 <span id="application-configurations"></span>
[エントリ・スクリプト](structure-entry-scripts.md) は、アプリケーションを作成するときに、下記のように、[構成情報](concept-configurations.md) を読み込んで、それをアプリケーションに適用します。
[エントリ・スクリプト](structure-entry-scripts.md) は、アプリケーションを作成するときに、下記のように、
[構成情報](concept-configurations.md) を読み込んで、それをアプリケーションに適用します。
```php
require __DIR__ . '/../vendor/autoload.php';
@ -26,8 +29,10 @@ $config = require __DIR__ . '/../config/web.php';
(new yii\web\Application($config))->run();
```
通常の [構成情報](concept-configurations.md) と同じように、アプリケーションの構成情報は、アプリケーション・オブジェクトのプロパティをどのように初期化するかを指定するものです。
アプリケーションの構成情報は、たいていは非常に複雑なものですから、通常は、上記の例の `web.php` ファイルのように、[構成情報ファイル](concept-configurations.md#configuration-files) に保管されます。
通常の [構成情報](concept-configurations.md) と同じように、アプリケーションの構成情報は、
アプリケーション・オブジェクトのプロパティをどのように初期化するかを指定するものです。
アプリケーションの構成情報は、たいていは非常に複雑なものですから、通常は、上記の例の `web.php` ファイルのように、
[構成情報ファイル](concept-configurations.md#configuration-files) に保管されます。
## アプリケーションのプロパティ <span id="application-properties"></span>
@ -55,22 +60,22 @@ $config = require __DIR__ . '/../config/web.php';
[[yii\base\Application::basePath|basePath]] プロパティは、アプリケーションのルート・ディレクトリを指定するものです。
これは、アプリケーション・システムの全ての保護されたソース・コードを収容するディレクトリです。
通常、このディレクトリの下に、MVC パターンに対応するソース・コードを収容した `models`、`views`、`controllers` などのサブ・ディレクトリがあります。
通常、このディレクトリの下に、MVC パターンに対応するソース・コードを収容した `models`、`views`、`controllers`
などのサブ・ディレクトリがあります。
[[yii\base\Application::basePath|basePath]] プロパティの構成には、ディレクトリ・パスを使っても、[パス・エイリアス](concept-aliases.md) を使っても構いません。
どちらの形式においても、対応するディレクトリが存在しなければなりません。
さもなくば、例外が投げられます。
パスは `realpath()` 関数を呼び出して正規化されます。
さもなくば、例外が投げられます。パスは `realpath()` 関数を呼び出して正規化されます。
[[yii\base\Application::basePath|basePath]] プロパティは、しばしば、他の重要なパス (例えば、runtime のパス) を派生させるために使われます。
このため、`basePath` を示す `@app` というパス・エイリアスが、あらかじめ定義されています。
その結果、派生的なパスはこのエイリアスを使って形成することが出来ます
(例えば、runtime ディレクトリを示す `@app/runtime` など)。
その結果、派生的なパスはこのエイリアスを使って形成することが出来ます(例えば、runtime ディレクトリを示す `@app/runtime` など)。
### 重要なプロパティ<span id="important-properties"></span>
この項で説明するプロパティは、アプリケーションごとに異なってくるものであるため、たいてい、構成する必要が生じます。
この項で説明するプロパティは、アプリケーションごとに異なるものであるため、
構成する必要がよく生じるものです。
#### [[yii\base\Application::aliases|aliases]] <span id="aliases"></span>
@ -88,14 +93,16 @@ $config = require __DIR__ . '/../config/web.php';
]
```
このプロパティが提供されているのは、[[Yii::setAlias()]] メソッドを呼び出す代りに、アプリケーションの構成情報を使ってエイリアスを定義することが出来るようにするためです。
このプロパティが提供されているのは、[[Yii::setAlias()]] メソッドを呼び出す代りに、
アプリケーションの構成情報を使ってエイリアスを定義することが出来るようにするためです。
#### [[yii\base\Application::bootstrap|bootstrap]] <span id="bootstrap"></span>
これは非常に有用なプロパティです。
これによって、アプリケーションの [[yii\base\Application::bootstrap()|ブートストラップの過程]] において走らせるべきコンポーネントを配列として指定することが出来ます。
例えば、ある [モジュール](structure-modules.md) に [URL 規則](runtime-routing.md) をカスタマイズさせたいときに、モジュールの ID をこのプロパティの要素として挙げることが出来ます。
例えば、ある [モジュール](structure-modules.md) に [URL 規則](runtime-routing.md) をカスタマイズさせたいときに、
モジュールの ID をこのプロパティの要素として挙げることが出来ます。
このプロパティにリストする各コンポーネントは、以下の形式のいずれかによって指定することが出来ます。
@ -130,8 +137,10 @@ $config = require __DIR__ . '/../config/web.php';
]
```
> Info: モジュール ID と同じ ID のアプリケーション・コンポーネントがある場合は、ブートストラップの過程ではアプリケーション・コンポーネントが使われます。
> Info: モジュール ID と同じ ID のアプリケーション・コンポーネントがある場合は、
> ブートストラップの過程ではアプリケーション・コンポーネントが使われます。
> 代りにモジュールを使いたいときは、次のように、無名関数を使って指定することが出来ます。
>
> ```php
> [
> function () {
@ -140,11 +149,14 @@ $config = require __DIR__ . '/../config/web.php';
> ]
> ```
ブートストラップの過程で、各コンポーネントのインスタンスが作成されます。
そして、コンポーネント・クラスが [[yii\base\BootstrapInterface]] を実装している場合は、その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドも呼び出されます。
そして、コンポーネント・クラスが [[yii\base\BootstrapInterface]] を実装している場合は、
その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドも呼び出されます。
もう一つの実用的な例が [ベーシック・プロジェクト・テンプレート](start-installation.md) のアプリケーションの構成情報の中にあります。
そこでは、アプリケーションが開発環境で走るときには `debug` モジュールと `gii` モジュールがブートストラップ・コンポーネントとして構成されています。
そこでは、アプリケーションが開発環境で走るときには `debug` モジュールと `gii` モジュールが
ブートストラップ・コンポーネントとして構成されています。
```php
if (YII_ENV_DEV) {
@ -158,8 +170,7 @@ if (YII_ENV_DEV) {
```
> Note: あまり多くのコンポーネントを `bootstrap` に置くと、アプリケーションのパフォーマンスを劣化させます。
なぜなら、リクエストごとに同じ一連のコンポーネントを走らせなければならないからです。
ですから、ブートストラップ・コンポーネントは賢く使ってください。
なぜなら、リクエストごとに同じ一連のコンポーネントを走らせなければならないからです。ですから、ブートストラップ・コンポーネントは賢く使ってください。
#### [[yii\web\Application::catchAll|catchAll]] <span id="catchAll"></span>
@ -169,8 +180,7 @@ if (YII_ENV_DEV) {
これは主としてアプリケーションがメンテナンス・モードにあって、入ってくる全てのリクエストを単一のアクションで処理する必要があるときに使われます。
構成情報は配列の形を取り、最初の要素はアクションのルートを指定します。
そして、配列の残りの要素 (キー・値のペア) は、アクションに渡されるパラメータを指定します。
例えば、
そして、配列の残りの要素 (キー・値のペア) は、アクションに渡されるパラメータを指定します。例えば、
```php
[
@ -184,12 +194,10 @@ if (YII_ENV_DEV) {
> Info: このプロパティを有効にすると、開発環境でデバッグ・パネルが動作しなくなります。
#### [[yii\base\Application::components|components]] <span id="components"></span>
これこそが、唯一の最も重要なプロパティです。
これによって、[アプリケーション・コンポーネント](structure-application-components.md) と呼ばれる一連の名前付きのコンポーネントを登録して、それらを他の場所で使うことが出来るようになります。
例えば、
これによって、[アプリケーション・コンポーネント](structure-application-components.md) と呼ばれる一連の名前付きのコンポーネントを登録して、それらを他の場所で使うことが出来るようになります。例えば、
```php
[
@ -234,7 +242,8 @@ if (YII_ENV_DEV) {
]
```
このプロパティの配列のキーはコントローラ ID を表し、配列の値は対応するコントローラ・クラスの名前または [構成情報](concept-configurations.md) を表します。
このプロパティの配列のキーはコントローラ ID を表し、配列の値は対応するコントローラ・クラスの名前または
[構成情報](concept-configurations.md) を表します。
#### [[yii\base\Application::controllerNamespace|controllerNamespace]] <span id="controllerNamespace"></span>
@ -244,12 +253,15 @@ if (YII_ENV_DEV) {
コントローラ ID が `post` である場合、規約によって対応するコントローラの (名前空間を略した) クラス名は `PostController` となり、完全修飾クラス名は `app\controllers\PostController` となります。
コントローラ・クラスは、この名前空間に対応するディレクトリのサブ・ディレクトリに配置されても構いません。
例えば、コントローラ ID として `admin/post` を仮定すると、対応するコントローラの完全修飾クラス名は `app\controllers\admin\PostController` となります。
例えば、コントローラ ID として `admin/post` を仮定すると、対応するコントローラの完全修飾クラス名は
`app\controllers\admin\PostController` となります。
重要なことは、完全修飾されたコントローラ・クラスが [オートロード可能](concept-autoloading.md) でなければならず、コントローラ・クラスの実際の名前空間がこのプロパティと合致していなければならない、ということです。
重要なことは、完全修飾されたコントローラ・クラスが [オートロード可能](concept-autoloading.md) でなければならず、
コントローラ・クラスの実際の名前空間がこのプロパティと合致していなければならない、ということです。
そうでないと、アプリケーションにアクセスしたときに "ページがみつかりません" というエラーを受け取ることになります。
上で説明された規約を破りたい場合は、[controllerMap](#controllerMap) プロパティを構成することが出来ます。
上で説明された規約を破りたい場合は、
[controllerMap](#controllerMap) プロパティを構成することが出来ます。
#### [[yii\base\Application::language|language]] <span id="language"></span>
@ -259,7 +271,9 @@ if (YII_ENV_DEV) {
アプリケーションが多言語をサポートする必要があるときは、このプロパティを構成しなければなりません。
このプロパティの値が、メッセージの翻訳、日付の書式、数字の書式などを含む [国際化](tutorial-i18n.md) のさまざまな側面を決定します。
例えば、[[yii\jui\DatePicker]] ウィジェットは、どの言語でカレンダーを表示すべきか、そして日付をどのように書式設定すべきかを、デフォルトでは、このプロパティを使用して決定します。
例えば、[[yii\jui\DatePicker]] ウィジェットは、どの言語でカレンダーを表示すべきか、
そして日付をどのように書式設定すべきかを、デフォルトでは、
このプロパティを使用して決定します。
言語を指定するのには、[IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従うことが推奨されます。
例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。
@ -295,7 +309,8 @@ if (YII_ENV_DEV) {
#### [[yii\base\Application::name|name]] <span id="name"></span>
このプロパティは、エンド・ユーザに対して表示されるアプリケーション名を指定するものです。
[[yii\base\Application::id|id]] プロパティがユニークな値を取らなければならないのとは違って、このプロパティの値は主として表示目的であり、ユニークである必要はありません。
[[yii\base\Application::id|id]] プロパティがユニークな値を取らなければならないのとは違って、
このプロパティの値は主として表示目的であり、ユニークである必要はありません。
コードのどこにも使わないのであれば、このプロパティは必ずしも構成する必要はありません。
@ -303,7 +318,8 @@ if (YII_ENV_DEV) {
#### [[yii\base\Application::params|params]] <span id="params"></span>
このプロパティは、グローバルにアクセス可能なアプリケーション・パラメータの配列を指定するものです。
コードの中のいたる処でハードコードされた数値や文字列を使う代りに、それらをアプリケーション・パラメータとして一ヶ所で定義し、必要な場所ではそのパラメータを使うというのが良いプラクティスです。
コードの中のいたる処でハードコードされた数値や文字列を使う代りに、それらをアプリケーション・パラメータとして一ヶ所で定義し、
必要な場所ではそのパラメータを使うというのが良いプラクティスです。
例えば、次のように、サムネール画像のサイズをパラメータとして定義することが出来ます。
```php
@ -321,16 +337,17 @@ $size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0];
```
後でサムネールのサイズを変更すると決めたときは、アプリケーションの構成情報においてのみサイズを修正すればよく、これに依存するコードには少しも触れる必要がありません。
後でサムネールのサイズを変更すると決めたときは、アプリケーションの構成情報においてのみサイズを修正すればよく、
これに依存するコードには少しも触れる必要がありません。
#### [[yii\base\Application::sourceLanguage|sourceLanguage]] <span id="sourceLanguage"></span>
このプロパティはアプリケーション・コードが書かれている言語を指定するものです。
デフォルト値は `'en-US'`、アメリカ合衆国の英語です。
このプロパティはアプリケーション・コードが書かれている言語を指定するものです。デフォルト値は `'en-US'`、アメリカ合衆国の英語です。
あなたのコードのテキストのコンテントが英語以外で書かれているときは、このプロパティを構成しなければなりません。
[language](#language) プロパティと同様に、このプロパティは [IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従って構成しなければなりません。
[language](#language) プロパティと同様に、このプロパティは
[IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従って構成しなければなりません。
例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。
このプロパティに関する詳細は [国際化](tutorial-i18n.md) のセクションで読むことが出来ます。
@ -357,14 +374,14 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### 有用なプロパティ <span id="useful-properties"></span>
この項で説明されるプロパティは通常は構成されません。というのは、そのデフォルト値が通常の規約を指定しているからです。
この項で説明されるプロパティは通常は構成されません。というのは、そのデフォルト値が通常の規約に由来するものであるからです。
しかしながら、規約を破る必要がある場合には、これらのプロパティを構成することが出来ます。
#### [[yii\base\Application::charset|charset]] <span id="charset"></span>
このプロパティはアプリケーションが使う文字セットを指定するものです。
デフォルト値は `'UTF-8'` であり、あなたのアプリケーションが多数の非ユニコード・データを使うレガシー・システムと連携するのでなければ、たいていのアプリケーションでは、そのままにしておくべきです。
デフォルト値は `'UTF-8'` であり、多数の非ユニコード・データを使うレガシー・システムを扱っている場合を除けば、たいていのアプリケーションでは、そのままにしておくべきです。
#### [[yii\base\Application::defaultRoute|defaultRoute]] <span id="defaultRoute"></span>
@ -374,10 +391,12 @@ $width = \Yii::$app->params['thumbnail.size'][0];
例えば、`help`、`post/create`、`admin/post/create` などです。
アクション ID が与えられていない場合は、[[yii\base\Controller::defaultAction]] で指定されるデフォルト値を取ります。
[[yii\web\Application|ウェブ・アプリケーション]] では、このプロパティのデフォルト値は `'site'` であり、その意味するところは、`SiteController` コントローラとそのデフォルト・アクションが使用されるべきである、ということです。
[[yii\web\Application|ウェブ・アプリケーション]] では、このプロパティのデフォルト値は `'site'` であり、
その意味するところは、`SiteController` コントローラとそのデフォルト・アクションが使用されるべきである、ということです。
結果として、ルートを指定せずにアプリケーションにアクセスすると、`app\controllers\SiteController::actionIndex()` の結果が表示されます。
[[yii\console\Application|コンソール・アプリケーション]] では、デフォルト値は `'help'` であり、コア・コマンドの [[yii\console\controllers\HelpController::actionIndex()]] が使用されるべきであるという意味です。
[[yii\console\Application|コンソール・アプリケーション]] では、デフォルト値は `'help'` であり、
コア・コマンドの [[yii\console\controllers\HelpController::actionIndex()]] が使用されるべきであるという意味です。
結果として、何も引数を与えずに `yii` というコマンドを実行すると、ヘルプ情報が表示されることになります。
@ -419,7 +438,8 @@ $width = \Yii::$app->params['thumbnail.size'][0];
このプロパティは、[ビュー](structure-views.md) をレンダリングするときに使われるべきデフォルトのレイアウトを指定するものです。
デフォルト値は `'main'` であり、[レイアウト・パス](#layoutPath) の下にある `main.php` というファイルが使われるべきことを意味します。
[レイアウト・パス](#layoutPath) と [ビュー・パス](#viewPath) の両方がデフォルト値を取る場合、デフォルトのレイアウト・ファイルは `@app/views/layouts/main.php` というパス・エイリアスとして表すことが出来ます。
[レイアウト・パス](#layoutPath) と [ビュー・パス](#viewPath) の両方がデフォルト値を取る場合、デフォルトのレイアウト・ファイルは
`@app/views/layouts/main.php` というパス・エイリアスとして表すことが出来ます。
滅多には無いことですが、レイアウトをデフォルトで無効にしたい場合は、このプロパティを `false` として構成することが出来ます。
@ -427,10 +447,10 @@ $width = \Yii::$app->params['thumbnail.size'][0];
#### [[yii\base\Application::layoutPath|layoutPath]] <span id="layoutPath"></span>
このプロパティは、レイアウト・ファイルが捜されるべきパスを指定するものです。
デフォルト値は、[ビューパス](#viewPath) の下の `layouts` サブ・ディレクトリです。
デフォルト値は、[ビューパス](#viewPath) の下の `layouts` サブ・ディレクトリです。
[ビュー・パス](#viewPath) がデフォルト値を取る場合、デフォルトのレイアウト・パスは `@app/views/layouts` というパス・エイリアスとして表すことが出来ます。
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。
#### [[yii\base\Application::runtimePath|runtimePath]] <span id="runtimePath"></span>
@ -438,7 +458,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
このプロパティは、ログ・ファイルやキャッシュ・ファイルなどの一時的ファイルを生成することが出来るパスを指定するものです。
デフォルト値は、`@app/runtime` というエイリアスで表現されるディレクトリです。
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。
ランタイムパスは、アプリケーションを実行するプロセスによって書き込みが可能なものでなければならないことに注意してください。
そして、この下にある一時的ファイルは秘匿を要する情報を含みうるものですので、ランタイム・パスはエンド・ユーザによるアクセスから保護されなければなりません。
@ -447,18 +467,17 @@ $width = \Yii::$app->params['thumbnail.size'][0];
#### [[yii\base\Application::viewPath|viewPath]] <span id="viewPath"></span>
このプロパティはビュー・ファイルが配置されるルート・ディレクトリを指定するものです。
デフォルト値は、`@app/views` というエイリアスで表現されるディレクトリです。
このプロパティはビュー・ファイルが配置されるルート・ディレクトリを指定するものです。デフォルト値は、`@app/views` というエイリアスで表現されるディレクトリです。
このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。
#### [[yii\base\Application::vendorPath|vendorPath]] <span id="vendorPath"></span>
このプロパティは、[Composer](https://getcomposer.org) によって管理される vendor ディレクトリを指定するものです。
Yii フレームワークを含めて、あなたのアプリケーションによって使われる全てのサードパーティ・ライブラリを格納するディレクトリです。
Yii フレームワークを含めて、あなたのアプリケーションによって使われる全てのサードパーティ・ライブラリを格納するディレクトリです。
デフォルト値は、`@app/vendor` というエイリアスで表現されるディレクトリです。
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。
このプロパティを修正するときは、必ず、Composer の構成もそれに合せて修正してください。
このパスに簡単にアクセスできるように、Yii は `@vendor` というパス・エイリアスを事前に定義しています。
@ -472,7 +491,7 @@ Yii リリースに含まれているコア・コマンドを有効にすべき
## アプリケーションのイベント <span id="application-events"></span>
アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントをトリガします。
アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントをトリガします。
これらのイベントに対して、下記のようにして、アプリケーションの構成情報の中でイベント・ハンドラをアタッチすることが出来ます。
```php
@ -483,7 +502,8 @@ Yii リリースに含まれているコア・コマンドを有効にすべき
]
```
`on eventName` という構文の使い方については、[構成情報](concept-configurations.md#configuration-format) のセクションで説明されています。
`on eventName` という構文の使い方については、[構成情報](concept-configurations.md#configuration-format)
のセクションで説明されています。
別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベント・ハンドラをアタッチすることも出来ます。
例えば、
@ -496,8 +516,7 @@ Yii リリースに含まれているコア・コマンドを有効にすべき
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] <span id="beforeRequest"></span>
このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。
実際のイベント名は `beforeRequest` です。
このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。実際のイベント名は `beforeRequest` です。
このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。
ですから、イベント・メカニズムを使って、リクエスト処理のプロセスに干渉するカスタム・コードを挿入するのには、ちょうど良い場所です。
@ -509,7 +528,8 @@ Yii リリースに含まれているコア・コマンドを有効にすべき
このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* にトリガされます。
実際のイベント名は `afterRequest` です。
このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。
このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、
リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。
[[yii\web\Response|response]] コンポーネントも、エンド・ユーザにレスポンスのコンテントを送出する間にいくつかのイベントをトリガすることに注意してください。
それらのイベントは、このイベントの *後* にトリガされます。
@ -536,8 +556,9 @@ Yii リリースに含まれているコア・コマンドを有効にすべき
```
同じ `beforeAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) からもトリガされることに注意してください。
アプリケーション・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントをトリガします。
イベント・ハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。
アプリケーション・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、
そして最後にコントローラがこのイベントをトリガします。
いずれかのイベント・ハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。
### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] <span id="afterAction"></span>
@ -562,26 +583,29 @@ Yii リリースに含まれているコア・コマンドを有効にすべき
同じ `afterAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) からもトリガされることに注意してください。
これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントをトリガします。
すなわち、コントローラ・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントをトリガします。
すなわち、コントローラ・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、
そして最後にアプリケーションがこのイベントをトリガします。
## アプリケーションのライフサイクル<span id="application-lifecycle"></span>
## アプリケーションのライフサイクル<span id="application-lifecycle"></span>
![アプリケーションのライフサイクル](images/application-lifecycle.png)
![アプリケーションのライフサイクル](images/application-lifecycle.png)
[エントリ・スクリプト](structure-entry-scripts.md) が実行されて、リクエストが処理されるとき、アプリケーションは次のようなライフ・サイクルを経ます。
[エントリ・スクリプト](structure-entry-scripts.md) が実行されて、リクエストが処理されるとき、
アプリケーションは次のようなライフサイクルを経ます。
1. エントリ・スクリプトがアプリケーションの構成情報を配列として読み出す。
2. エントリ・スクリプトがアプリケーションの新しいインスタンスを作成する。
* [[yii\base\Application::preInit()|preInit()]] が呼び出されて、[[yii\base\Application::basePath|basePath]] のような、優先度の高いアプリケーション・プロパティを構成する。
* [[yii\base\Application::preInit()|preInit()]] が呼び出されて、[[yii\base\Application::basePath|basePath]] のような、
優先度の高いアプリケーション・プロパティを構成する。
* [[yii\base\Application::errorHandler|エラー・ハンドラ]] を登録する。
* アプリケーションのプロパティを構成する。
* [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップ・コンポーネントを走らせるために、[[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。
* [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップ・コンポーネントを走らせるために、
[[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。
3. エントリ・スクリプトが [[yii\base\Application::run()]] を呼んで、アプリケーションを走らせる。
* [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントをトリガする。
* リクエストを処理する: リクエストを [ルート](runtime-routing.md) とそれに結び付くパラメータとして解決する。
ルートによって指定されたモジュール、コントローラ、および、アクションを作成する。
そしてアクションを実行する。
ルートによって指定されたモジュール、コントローラ、および、アクションを作成する。そしてアクションを実行する。
* [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントをトリガする。
* エンド・ユーザにレスポンスを送信する。
4. エントリ・スクリプトがアプリケーションから終了ステータスを受け取り、リクエストの処理を完了する。

211
docs/guide-ja/structure-assets.md

@ -1,8 +1,7 @@
アセット
========
Yii では、アセットは、ウェブ・ページで参照できるファイルを意味します。
アセットは CSS ファイルであったり、JavaScript ファイルであったり、画像やビデオのファイルであったりします。
Yii では、アセットは、ウェブ・ページで参照できるファイルを意味します。アセットは CSS ファイルであったり、JavaScript ファイルであったり、画像やビデオのファイルであったりします。
アセットはウェブでアクセス可能なディレクトリに配置され、ウェブ・サーバによって直接に提供されます。
たいていの場合、アセットはプログラム的に管理する方が望ましいものです。
@ -14,7 +13,8 @@ Yii では、アセットは、ウェブ・ページで参照できるファイ
## アセット・バンドル <span id="asset-bundles"></span>
Yii はアセットを *アセット・バンドル* を単位として管理します。アセット・バンドルは、簡単に言えば、あるディレクトリの下に集められた一群のアセットです。
Yii はアセットを *アセット・バンドル* を単位として管理します。アセット・バンドルは、簡単に言えば、
あるディレクトリの下に集められた一群のアセットです。
[ビュー](structure-views.md) の中でアセット・バンドルを登録すると、バンドルの中の CSS や JavaScript のファイルがレンダリングされるウェブ・ページに挿入されます。
@ -22,8 +22,8 @@ Yii はアセットを *アセット・バンドル* を単位として管理し
アセット・バンドルは [[yii\web\AssetBundle]] から拡張された PHP クラスとして定義されます。
バンドルの名前は、対応する PHP クラスの完全修飾名 (先頭のバック・スラッシュを除く) です。
アセット・バンドルクラスは [オートロード可能](concept-autoloading.md) でなければなりません。
アセット・バンドルクラスは、通常、アセットがどこに置かれているか、バンドルがどういう CSS や JavaScript のファイルを含んでいるか、そして、バンドルが他のバンドルにどのように依存しているかを定義します。
アセット・バンドルクラスは [オートロード可能](concept-autoloading.md) でなければなりません。
アセット・バンドルクラスは、通常、アセットがどこに置かれているか、バンドルがどういう CSS や JavaScript のファイルを含んでいるか、そして、バンドルが他のバンドルにどのように依存しているかを定義します。
以下のコードは [ベーシック・プロジェクト・テンプレート](start-installation.md) によって使用されているメインのアセット・バンドルを定義するものです。
@ -57,15 +57,17 @@ class AppAsset extends AssetBundle
以下、[[yii\web\AssetBundle]] のプロパティに関して、更に詳細に説明します。
* [[yii\web\AssetBundle::sourcePath|sourcePath]]: このバンドルのアセット・ファイルを含むルート・ディレクトリを指定します。
ルート・ディレクトリがウェブからアクセス可能でない場合に、このプロパティをセットしなければなりません。
ルート・ディレクトリがウェブアクセス可能でない場合に、このプロパティをセットしなければなりません。
そうでない場合は、代りに、[[yii\web\AssetBundle::basePath|basePath]] と [[yii\web\AssetBundle::baseUrl|baseUrl]] のプロパティをセットしなければなりません。
[パス・エイリアス](concept-aliases.md) をここで使うことが出来ます。
* [[yii\web\AssetBundle::basePath|basePath]]: このバンドルのアセット・ファイルを含むウェブからアクセス可能なディレクトリを指定します。
[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、[アセットマネージャ](#asset-manager) がバンドルに含まれるファイルをウェブからアクセス可能なディレクトリに発行して、その結果、このプロパティを上書きします。
アセット・ファイルが既にウェブからアクセス可能なディレクトリにあり、アセットの発行が必要でない場合に、このプロパティをセットしなければなりません。
* [[yii\web\AssetBundle::basePath|basePath]]: このバンドルのアセット・ファイルを含むウェブ・アクセス可能なディレクトリを指定します。
[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、[アセット・マネージャ](#asset-manager) がバンドルに含まれるファイルをウェブ・アクセス可能なディレクトリに発行して、
その結果、このプロパティを上書きします。
アセット・ファイルが既にウェブ・アクセス可能なディレクトリにあり、アセットの発行が必要でない場合に、このプロパティをセットしなければなりません。
[パス・エイリアス](concept-aliases.md) をここで使うことが出来ます。
* [[yii\web\AssetBundle::baseUrl|baseUrl]]: [[yii\web\AssetBundle::basePath|basePath]] ディレクトリに対応する URL を指定します。
[[yii\web\AssetBundle::basePath|basePath]] と同じように、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、[アセット・マネージャ](#asset-manager) がアセットを発行して、その結果、このプロパティを上書きします。
[[yii\web\AssetBundle::basePath|basePath]] と同じように、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、
[アセット・マネージャ](#asset-manager) がアセットを発行して、その結果、このプロパティを上書きします。
[パス・エイリアス](concept-aliases.md) をここで使うことが出来ます。
* [[yii\web\AssetBundle::css|css]]: このバンドルに含まれている CSS ファイルをリストする配列です。
ディレクトリの区切りとしてフォワード・スラッシュ "/" だけを使わなければならないことに注意してください。
@ -77,11 +79,16 @@ class AppAsset extends AssetBundle
実際のファイルのパスは、この相対パスの前に [[yii\web\AssetManager::basePath]] を付けることによって決定されます。
また、実際の URL は、この相対パスの前に [[yii\web\AssetManager::baseUrl]] を付けることによって決定されます。
- 外部の JavaScript ファイルを表す絶対 URL。
例えば、`http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` や `//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` など。
例えば、`http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` や
`//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` など。
* [[yii\web\AssetBundle::depends|depends]]: このバンドルが依存しているアセット・バンドルの名前をリストする配列です
(バンドルの依存関係については、すぐ後で説明します)。
* [[yii\web\AssetBundle::jsOptions|jsOptions]]: このバンドルにある *全て* の JavaScript ファイルについて、それを登録するときに呼ばれる [[yii\web\View::registerJsFile()]] メソッドに渡されるオプションを指定します。
* [[yii\web\AssetBundle::publishOptions|publishOptions]]: ソースのアセット・ファイルをウェブ・ディレクトリに発行するときに呼ばれる [[yii\web\AssetManager::publish()]] メソッドに渡されるオプションを指定します。
* [[yii\web\AssetBundle::jsOptions|jsOptions]]: このバンドルにある *全て* の JavaScript ファイルについて、
それを登録するときに呼ばれる [[yii\web\View::registerJsFile()]] メソッドに渡されるオプションを指定します。
* [[yii\web\AssetBundle::cssOptions|cssOptions]]: このバンドルにある *全て* の CSS ファイルについて、
それを登録するときに呼ばれる [[yii\web\View::registerCssFile()]] メソッドに渡されるオプションを指定します。
* [[yii\web\AssetBundle::publishOptions|publishOptions]]: ソースのアセット・ファイルをウェブ・ディレクトリに発行するときに呼ばれる
[[yii\web\AssetManager::publish()]] メソッドに渡されるオプションを指定します。
これは [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定した場合にだけ使用されます。
@ -89,43 +96,53 @@ class AppAsset extends AssetBundle
アセットは、配置場所を基準にして、次のように分類することが出来ます。
* ソースアセット: アセット・ファイルは、ウェブ経由で直接にアクセスすることが出来ない PHP ソース・コードと一緒に配置されています。
ページの中でソースアセットを使用するためには、ウェブ・ディレクトリにコピーして、いわゆる発行されたアセットに変換しなければなりません。
* ソースアセット: アセット・ファイルは、ウェブ経由で直接にアクセスすることが出来ない PHP ソース・コードと一緒に配置されています。
ページの中でソースアセットを使用するためには、ウェブ・ディレクトリにコピーして、いわゆる発行されたアセットに変換しなければなりません。
このプロセスは、すぐ後で詳しく説明しますが、*アセット発行* と呼ばれます。
* 発行されたアセット: アセット・ファイルはウェブ・ディレクトリに配置されており、したがってウェブ経由で直接にアクセスすることが出来ます。
* 外部アセット: アセット・ファイルは、あなたのウェブ・アプリケーションをホストしているのとは別のウェブ・サーバ上に配置されています。
* 外部アセット: アセット・ファイルは、あなたのウェブ・アプリケーションをホストしているのとは別のウェブ・サーバ上に
配置されています。
アセット・バンドル・クラスを定義するときに、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定した場合は、相対パスを使ってリストに挙げられたアセットは全てソースアセットであると見なされます。
アセット・バンドル・クラスを定義するときに、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定した場合は、
相対パスを使ってリストに挙げられたアセットは全てソース・アセットであると見なされます。
このプロパティを指定しなかった場合は、アセットは発行されたアセットであることになります
(したがって、[[yii\web\AssetBundle::basePath|basePath]] と [[yii\web\AssetBundle::baseUrl|baseUrl]] を指定して、アセットがどこに配置されているかを Yii に知らせなければなりません)。
アプリケーションに属するアセットは、不要なアセット発行プロセスを避けるために、ウェブ・ディレクトリに置くことが推奨されます。
前述の例において `AppAsset` が [[yii\web\AssetBundle::sourcePath|sourcePath]] ではなく [[yii\web\AssetBundle::basePath|basePath]] を指定しているのは、これが理由です。
前述の例において `AppAsset` が [[yii\web\AssetBundle::sourcePath|sourcePath]] ではなく
[[yii\web\AssetBundle::basePath|basePath]] を指定しているのは、これが理由です。
[エクステンション](structure-extensions.md) の場合は、アセットがソース・コードと一緒にウェブからアクセス出来ないディレクトリに配置されているため、アセット・バンドル・クラスを定義するときには [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定しなければなりません。
[エクステンション](structure-extensions.md) の場合は、
アセットがソース・コードと一緒にウェブからアクセス出来ないディレクトリに配置されているため、
アセット・バンドル・クラスを定義するときには [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定しなければなりません。
> Note: `@webroot/assets` を [[yii\web\AssetBundle::sourcePath|ソース・パス]] として使ってはいけません。
このディレクトリは、デフォルトでは、[[yii\web\AssetManager|アセット・マネージャ]] がソースの配置場所から発行されたアセット・ファイルを保存する場所として使われます。
このディレクトリの中のファイルはすべて一時的なものと見なされており、削除されることがあります。
このディレクトリの中のファイルはすべて一時的なものと見なされており、
削除されることがあります。
### アセットの依存関係 <span id="asset-dependencies"></span>
ウェブ・ページに複数の CSS や JavaScript ファイルをインクルードするときは、オーバーライドの問題を避けるために、一定の順序に従わなければなりません。
例えば、ウェブ・ページで jQuery UI ウィジェットを使おうとするときは、jQuery JavaScript ファイルが jQuery UI JavaScript ファイルより前にインクルードされることを保証しなければなりません。
例えば、ウェブ・ページで jQuery UI ウィジェットを使おうとするときは、jQuery JavaScript ファイルが
jQuery UI JavaScript ファイルより前にインクルードされることを保証しなければなりません。
このような順序付けをアセット間の依存関係と呼びます。
アセットの依存関係は、主として、[[yii\web\AssetBundle::depends]] プロパティによって指定されます。
`AppAsset` の例では、このアセット・バンドルは他の二つのアセット・バンドル、すなわち、[[yii\web\YiiAsset]] と [[yii\bootstrap\BootstrapAsset]] に依存しています。
このことは、`AppAsset` の CSS と JavaScript ファイルが、依存している二つのアセット・バンドルにあるファイルの *後に* インクルードされることを意味します。
このことは、`AppAsset` の CSS と JavaScript ファイルが、依存している二つのアセット・バンドルにあるファイルの *後に*
インクルードされることを意味します。
アセットの依存関係は中継されます。つまり、バンドル A が B に依存し、B が C に依存していると、A は C にも依存していることになります。
### アセットのオプション <span id="asset-options"></span>
[[yii\web\AssetBundle::cssOptions|cssOptions]] および [[yii\web\AssetBundle::jsOptions|jsOptions]] のプロパティを指定して、CSS と JavaScript ファイルがページにインクルードされる方法をカスタマイズすることが出来ます。
これらのプロパティの値は、[ビュー](structure-views.md) が CSS と JavaScript ファイルをインクルードするために、[[yii\web\View::registerCssFile()]] および [[yii\web\View::registerJsFile()]] メソッドを呼ぶときに、それぞれ、オプションとして引き渡されます。
[[yii\web\AssetBundle::cssOptions|cssOptions]] および [[yii\web\AssetBundle::jsOptions|jsOptions]] のプロパティを指定して、
CSS と JavaScript ファイルがページにインクルードされる方法をカスタマイズすることが出来ます。
これらのプロパティの値は、[ビュー](structure-views.md) が CSS と JavaScript ファイルをインクルードするために、[[yii\web\View::registerCssFile()]] および
[[yii\web\View::registerJsFile()]] メソッドを呼ぶときに、それぞれ、オプションとして引き渡されます。
> Note: バンドル・クラスでセットしたオプションは、バンドルの中の *全て* の CSS/JavaScript ファイルに適用されます。
いろいろなファイルに別々のオプションを使用したい場合は、上述した [[yii\web\AssetBundle::css|css] の形式を使うか、
@ -158,7 +175,8 @@ JavaScript ファイルをページの head セクションにインクルード
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
```
デフォルトでは、アセット・バンドルが発行されるときは、[[yii\web\AssetBundle::sourcePath]] で指定されたディレクトリの中にある全てのコンテントが発行されます。
デフォルトでは、アセット・バンドルが発行されるときは、[[yii\web\AssetBundle::sourcePath]]
で指定されたディレクトリの中にある全てのコンテントが発行されます。
[[yii\web\AssetBundle::publishOptions|publishOptions]] プロパティを構成することによって、この振る舞いをカスタマイズすることが出来ます。
例えば、[[yii\web\AssetBundle::sourcePath]] の一個または数個のサブ・ディレクトリだけを発行するために、アセット・バンドル・クラスの中で下記のようにすることが出来ます。
@ -202,8 +220,7 @@ ___
この方法は NPM または Bower のパッケージを必要とするプロジェクトの大半の要求を満たすことが出来ます。
> Note: 2.0.13 以降、ベーシック・アプリケーション・テンプレートとアドバンスト・アプリケーション・テンプレートはともに、
デフォルトで asset-packagist を使うように前もって構成されていますので、
このセクションは読み飛ばすことが出来ます。
デフォルトで asset-packagist を使うように前もって構成されていますので、このセクションは読み飛ばすことが出来ます。
プロジェクトの `composer.json` に、下記を追加します。
@ -256,16 +273,18 @@ Yii を使ってこれらのアセットを発行したい場合は、プロジ
}
```
> Note: `fxp/composer-asset-plugin` は、asset-packagist に比べて、`composer update` コマンドを著しく遅くします。
> Note: `fxp/composer-asset-plugin` は、asset-packagist に比べて、`composer update`
コマンドを著しく遅くします。
____
Composer で Bower と NPM をサポートできるように構成した後は:
1. アプリケーションまたはエクステンションの `composer.json` ファイルを修正して、パッケージを `require` のエントリに入れます。
ライブラリを参照するのに、`bower-asset/PackageName` (Bower パッケージ) または `npm-asset/PackageName` (NPM パッケージ) を使わなければなりません。
ライブラリを参照するのに、`bower-asset/PackageName` (Bower パッケージ) または `npm-asset/PackageName` (NPM パッケージ)
を使わなければなりません。
2. `composer update` を実行します。
3. アセット・バンドルクラスを作成して、アプリケーションまたはエクステンションで使う予定の JavaScript/CSS ファイルをリストに挙げます。
3. アセット・バンドルクラスを作成して、アプリケーションまたはエクステンションで使う予定の JavaScript/CSS ファイルをリストに挙げます。
[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティは、`@bower/PackageName` または `@npm/PackageName` としなければなりません。
これは、Composer が Bower または NPM パッケージを、このエイリアスに対応するディレクトリにインストールするためです。
@ -284,20 +303,23 @@ use app\assets\AppAsset;
AppAsset::register($this); // $this はビュー・オブジェクトを表す
```
> Info: [[yii\web\AssetBundle::register()]] メソッドは、[[yii\web\AssetBundle::basePath|basePath]] や [[yii\web\AssetBundle::baseUrl|baseUrl]] など、発行されたアセットに関する情報を含むアセット・バンドル・オブジェクトを返します。
> Info: [[yii\web\AssetBundle::register()]] メソッドは、[[yii\web\AssetBundle::basePath|basePath]] や [[yii\web\AssetBundle::baseUrl|baseUrl]] など、
発行されたアセットに関する情報を含むアセット・バンドル・オブジェクトを返します。
他の場所でアセット・バンドルを登録しようとするときは、必要とされるビュー・オブジェクトを提供しなければなりません。
例えば、[ウィジェット](structure-widgets.md) クラスの中でアセット・バンドルを登録するためには、`$this->view` によってビュー・オブジェクトを取得することが出来ます。
例えば、[ウィジェット](structure-widgets.md)クラスの中でアセット・バンドルを登録するためには、`$this->view` によってビュー・オブジェクトを取得することが出来ます。
アセット・バンドルがビューに登録されるとき、舞台裏では、依存している全てのアセット・バンドルが Yii によって登録されます。
そして、アセット・バンドルがウェブからはアクセス出来ないディレクトリに配置されている場合は、アセット・バンドルがウェブ・ディレクトリに発行されます。
そして、アセット・バンドルがウェブからはアクセス出来ないディレクトリに配置されている場合は、
アセット・バンドルがウェブ・ディレクトリに発行されます。
その後、ビューがページをレンダリングするときに、登録されたバンドルのリストに挙げられている CSS と JavaScript ファイルのための `<link>` タグと `<script>` タグが生成されます。
これらのタグの順序は、登録されたバンドル間の依存関係、および、[[yii\web\AssetBundle::css]] と [[yii\web\AssetBundle::js]] のプロパティのリストに挙げられたアセットの順序によって決定されます。
これらのタグの順序は、登録されたバンドル間の依存関係、および、[[yii\web\AssetBundle::css]] と
[[yii\web\AssetBundle::js]] のプロパティのリストに挙げられたアセットの順序によって決定されます。
### 動的なアセット・バンドル <span id="dynamic-asset-bundles"></span>
アセット・バンドルは、通常の PHP クラスですので、内部のパラメータを動的に調整することに関係する追加のロジックを持つことが出来ます。
アセット・バンドルは、通常の PHP クラスですので、内部のパラメータを動的に調整する追加のロジックを持つことが出来ます。
例えば、洗練された JavaScript ライブラリには、国際化の機能を、サポートする言語ごとに独立したソース・ファイルにパッケージして提供しているものもあります。
その場合、ライブラリの翻訳を動作させるためには、特定の '.js' ファイルをページに追加しなければなりません。
このことを [[yii\web\AssetBundle::init()]] メソッドをオーバーライドすることによって実現することが出来ます。
@ -365,7 +387,8 @@ return [
```
複数のアセット・バンドルも同様に [[yii\web\AssetManager::bundles]] によって構成することが出来ます。
配列のキーは、アセット・バンドルのクラス名 (最初のバック・スラッシュを除く) とし、配列の値は、対応する [構成情報配列](concept-configurations.md) とします。
配列のキーは、アセット・バンドルのクラス名 (最初のバック・スラッシュを除く) とし、
配列の値は、対応する [構成情報配列](concept-configurations.md) とします。
> Tip: アセット・バンドルの中で使うアセットを条件的に選択することが出来ます。
> 次の例は、開発環境では `jquery.js` を使い、そうでなければ `jquery.min.js` を使う方法を示すものです。
@ -395,6 +418,7 @@ return [
],
];
```
[[yii\web\AssetManager::bundles]] を `false` にセットすることによって、*全て* のバンドルを無効にすることも出来ます。
[[yii\web\AssetManager::bundles]] によってなされたカスタマイズはアセット・バンドルの生成時、すなわち、オブジェクトのコンストラクタの段階で適用される、
@ -468,8 +492,10 @@ return [
```
[[yii\web\AssetManager::assetMap|assetMap]] のキーは修正したいアセットの名前であり、値は望ましいアセットのパスです。
アセット・バンドルをビューに登録するとき、[[yii\web\AssetBundle::css|css]] と [[yii\web\AssetBundle::js|js]] の配列に含まれるすべてのアセット・ファイルの相対パスがこのマップと突き合わせて調べられます。
キーのどれかがアセット・ファイルのパス (利用できる場合は、[[yii\web\AssetBundle::sourcePath]] が前置されます) の最後の部分と一致した場合は、対応する値によってアセットが置き換えられ、ビューに登録されます。
アセット・バンドルをビューに登録するとき、[[yii\web\AssetBundle::css|css]] と
[[yii\web\AssetBundle::js|js]] の配列に含まれるすべてのアセット・ファイルの相対パスがこのマップと突き合わせて調べられます。
キーのどれかがアセット・ファイルのパス (利用できる場合は、[[yii\web\AssetBundle::sourcePath]] が前置されます)
の最後の部分と一致した場合は、対応する値によってアセットが置き換えられ、ビューに登録されます。
例えば、`my/path/to/jquery.js` というアセット・ファイルは `jquery.js` というキーにマッチします。
> Note: 相対パスを使って指定されたアセットだけがアセット・マッピングの対象になります。
@ -478,11 +504,13 @@ return [
### アセット発行 <span id="asset-publishing"></span>
既に述べたように、アセット・バンドルがウェブからアクセス出来ないディレクトリに配置されている場合は、バンドルがビューに登録されるときに、アセットがウェブ・ディレクトリにコピーされます。
既に述べたように、アセット・バンドルがウェブからアクセス出来ないディレクトリに配置されている場合は、
バンドルがビューに登録されるときに、アセットがウェブ・ディレクトリにコピーされます。
このプロセスは *アセット発行* と呼ばれ、[[yii\web\AssetManager|アセット・マネージャ]] によって自動的に実行されます。
デフォルトでは、アセットが発行されるディレクトリは `@webroot/assets` であり、`@web/assets` という URL に対応するものです。
この場所は、[[yii\web\AssetManager::basePath|basePath]] と [[yii\web\AssetManager::baseUrl|baseUrl]] のプロパティを構成してカスタマイズすることが出来ます。
この場所は、[[yii\web\AssetManager::basePath|basePath]] と [[yii\web\AssetManager::baseUrl|baseUrl]]
のプロパティを構成してカスタマイズすることが出来ます。
ファイルをコピーすることでアセットを発行する代りに、OS とウェブ・サーバが許容するなら、シンボリック・リンクを使うことを考慮しても良いでしょう。
この機能は [[yii\web\AssetManager::linkAssets|linkAssets]] を `true` にセットすることで有効にすることが出来ます。
@ -498,8 +526,9 @@ return [
];
```
上記の構成によって、アセット・マネージャはアセット・バンドルを発行するときにソースパスへのシンボリックリンクを作成するようになります。
この方がファイルのコピーより速く、また、発行されたアセットが常に最新であることを保証することも出来ます。
上記の構成によって、アセット・マネージャはアセット・バンドルを発行するときにソース・パスへのシンボリック・リンクを作成するようになります。
この方がファイルのコピーより速く、また、
発行されたアセットが常に最新であることを保証することも出来ます。
### キャッシュの廃棄 <span id="cache-busting"></span>
@ -531,17 +560,18 @@ return [
コアの Yii コードは多くのアセット・バンドルを定義しています。
その中で、下記のバンドルはよく使われるものであり、あなたのアプリケーションやエクステンションのコードでも参照することが出来るものです。
- [[yii\web\YiiAsset]]: 主として `yii.js` ファイルをインクルードするためのバンドルです。
このファイルはモジュール化された JavaScript のコードを編成するメカニズムを実装しています。
- [[yii\web\YiiAsset]]: 主として `yii.js` ファイルをインクルードするためのバンドルです。 このファイルはモジュール化された JavaScript のコードを編成するメカニズムを実装しています。
また、`data-method` と `data-confirm` の属性に対する特別なサポートや、その他の有用な機能を提供します。
`yii.js` に関する詳細な情報は [クライアント・スクリプトのセクション](output-client-scripts.md#yii.js) にあります。
- [[yii\web\JqueryAsset]]: jQuery の bower パッケージから `jquery.js` ファイルをインクルードします。
- [[yii\bootstrap\BootstrapAsset]]: Twitter Bootstrap フレームワークから CSS ファイルをインクルードします。
- [[yii\bootstrap\BootstrapPluginAsset]]: Bootstrap JavaScript プラグインをサポートするために、Twitter Bootstrap フレームワークから JavaScript ファイルをインクルードします。
- [[yii\bootstrap\BootstrapPluginAsset]]: Bootstrap JavaScript プラグインをサポートするために、
Twitter Bootstrap フレームワークから JavaScript ファイルをインクルードします。
- [[yii\jui\JuiAsset]]: jQuery UI ライブラリから CSS と JavaScript のファイルをインクルードします。
あなたのコードが、jQuery や jQuery UI または Bootstrap に依存する場合は、自分自身のバージョンを作るのではなく、これらの定義済みのアセット・バンドルを使用すべきです。
これらのバンドルのデフォルトの設定があなたの必要を満たさない時は、[アセット・バンドルをカスタマイズする](#customizing-asset-bundles) の項で説明したように、それをカスタマイズすることが出来ます。
これらのバンドルのデフォルトの設定があなたの必要を満たさない時は、[アセット・バンドルをカスタマイズする](#customizing-asset-bundles)
の項で説明したように、それをカスタマイズすることが出来ます。
## アセット変換 <span id="asset-conversion"></span>
@ -550,8 +580,7 @@ return [
例えば、CSS コードのためには、[LESS](http://lesscss.org/) や [SCSS](http://sass-lang.com/) を使うことが出来ます。
また、JavaScript のためには、[TypeScript](http://www.typescriptlang.org/) を使うことが出来ます。
拡張構文を使ったアセット・ファイルをアセット・バンドルの中の [[yii\web\AssetBundle::css|css]] と [[yii\web\AssetBundle::js|js]] のリストに挙げることが出来ます。
例えば、
拡張構文を使ったアセット・ファイルをアセット・バンドルの中の [[yii\web\AssetBundle::css|css]] と [[yii\web\AssetBundle::js|js]] のリストに挙げることが出来ます。例えば、
```php
class AppAsset extends AssetBundle
@ -571,10 +600,13 @@ class AppAsset extends AssetBundle
}
```
このようなアセット・バンドルをビューに登録すると、[[yii\web\AssetManager|アセット・マネージャ]] が自動的にプリ・プロセッサ・ツールを走らせて、認識できた拡張構文のアセットを CSS/JavaScript に変換します。
最終的にビューがページをレンダリングするときには、ビューは元の拡張構文のアセットではなく、変換後の CSS/JavaScript ファイルをページにインクルードします。
このようなアセット・バンドルをビューに登録すると、[[yii\web\AssetManager|アセット・マネージャ]] が自動的にプリ・プロセッサ・ツールを走らせて、
認識できた拡張構文のアセットを CSS/JavaScript に変換します。
最終的にビューがページをレンダリングするときには、ビューは元の拡張構文のアセットではなく、
変換後の CSS/JavaScript ファイルをページにインクルードします。
Yii はファイル名の拡張子を使って、アセットが使っている拡張構文を識別します。デフォルトでは、下記の構文とファイル名拡張子を認識します。
Yii はファイル名の拡張子を使って、アセットが使っている拡張構文を識別します。
デフォルトでは、下記の構文とファイル名拡張子を認識します。
- [LESS](http://lesscss.org/): `.less`
- [SCSS](http://sass-lang.com/): `.scss`
@ -585,7 +617,8 @@ Yii はファイル名の拡張子を使って、アセットが使っている
Yii はインストールされたプリ・プロセッサ・ツールに頼ってアセットを変換します。
例えば、[LESS](http://lesscss.org/) を使うためには、`lessc` プリ・プロセッサ・コマンドをインストールしなければなりません。
下記のように [[yii\web\AssetManager::converter]] を構成することで、プリ・プロセッサ・コマンドとサポートされる拡張構文をカスタマイズすることが出来ます。
下記のように [[yii\web\AssetManager::converter]] を構成することで、
プリ・プロセッサ・コマンドとサポートされる拡張構文をカスタマイズすることが出来ます。
```php
return [
@ -604,11 +637,13 @@ return [
```
上記においては、サポートされる拡張構文が [[yii\web\AssetConverter::commands]] プロパティによって定義されています。
配列のキーはファイルの拡張子 (先頭のドットは省く) であり、配列の値は結果として作られるアセット・ファイルの拡張子とアセット変換を実行するためのコマンドです。
配列のキーはファイルの拡張子 (先頭のドットは省く) であり、
配列の値は結果として作られるアセット・ファイルの拡張子とアセット変換を実行するためのコマンドです。
コマンドの中の `{from}``{to}` のトークンは、ソースのアセット・ファイルのパスとターゲットのアセット・ファイルのパスに置き換えられます。
> Info: 上記で説明した方法の他にも、拡張構文のアセットを扱う方法はあります。
例えば、[grunt](http://gruntjs.com/) のようなビルド・ツールを使って、拡張構文のアセットをモニターし、自動的に変換することが出来ます。
例えば、[grunt](http://gruntjs.com/) のようなビルド・ツールを使って、拡張構文のアセットをモニターし、
自動的に変換することが出来ます。
この場合は、元のファイルではなく、結果として作られる CSS/JavaScript ファイルをアセット・バンドルのリストに挙げなければなりません。
@ -621,16 +656,21 @@ HTTP リクエストの数とこれらのファイルの全体としてのダウ
> Info: アセットの結合と圧縮は、通常はアプリケーションが本番モードにある場合に必要になります。
開発モードにおいては、たいていは元の CSS/JavaScript ファイルを使う方がデバッグのために好都合です。
次に、既存のアプリケーション・コードを修正する必要なしに、アセット・ファイルを結合して圧縮する方法を紹介します。
次に、既存のアプリケーション・コードを修正する必要なしに、
アセット・ファイルを結合して圧縮する方法を紹介します。
1. アプリケーションの中で、結合して圧縮する予定のアセット・バンドルを全て探し出す。
2. これらのバンドルを一個か数個のグループにまとめる。どのバンドルも一つのグループにしか属することが出来ないことに注意。
3. 各グループの CSS ファイルを一つのファイルに結合/圧縮する。JavaScript ファイルに対しても同様にこれを行う。
4. 各グループに対して新しいアセット・バンドルを定義する。
* [[yii\web\AssetBundle::css|css]] と [[yii\web\AssetBundle::js|js]] のプロパティに、それぞれ、結合された CSS ファイルと JavaScript ファイルをセットする。
* 各グループに属する元のアセット・バンドルをカスタマイズして、[[yii\web\AssetBundle::css|css]] と [[yii\web\AssetBundle::js|js]] のプロパティを空にし、[[yii\web\AssetBundle::depends|depends]] プロパティにグループのために作られた新しいバンドルを指定する。
この方法を使うと、ビューでアセット・バンドルを登録したときに、元のバンドルが属するグループのための新しいアセット・バンドルが自動的に登録されるようになります。
* [[yii\web\AssetBundle::css|css]] と [[yii\web\AssetBundle::js|js]] のプロパティに、
それぞれ、結合された CSS ファイルと JavaScript ファイルをセットする。
* 各グループに属する元のアセット・バンドルをカスタマイズして、[[yii\web\AssetBundle::css|css]] と
[[yii\web\AssetBundle::js|js]] のプロパティを空にし、[[yii\web\AssetBundle::depends|depends]]
プロパティにグループのために作られた新しいバンドルを指定する。
この方法を使うと、ビューでアセット・バンドルを登録したときに、
元のバンドルが属するグループのための新しいアセット・バンドルが自動的に登録されるようになります。
そして、結果として、結合/圧縮されたアセット・ファイルが、元のファイルの代りに、ページにインクルードされます。
@ -638,22 +678,23 @@ HTTP リクエストの数とこれらのファイルの全体としてのダウ
上記の方法をさらに説明するために一つの例を挙げましょう。
あなたのアプリケーションが二つのページ、X と Y を持つと仮定します。
ページ X はアセット・バンドル A、B、C を使用し、ページ Y はアセット・バンドル B、C、D を使用します。
あなたのアプリケーションが二つのページ、X と Y を持つと仮定します。ページ X はアセット・バンドル A、B、C を使用し、ページ Y はアセット・バンドル B、C、D を使用します。
これらのアセット・バンドルを分割する方法は二つあります。一つは単一のグループを使用して全てのアセット・バンドルを含める方法です。
もう一つは、A をグループ X に入れ、D をグループ Y に入れ、そして、B と C をグループ S に入れる方法です。どちらが良いでしょう? 場合によります。
もう一つは、A をグループ X に入れ、D をグループ Y に入れ、そして、B と C をグループ S に入れる方法です。
どちらが良いでしょう? 場合によります。
最初の方法の利点は、二つのページが同一の結合された CSS と JavaScript のファイルを共有するため、HTTP キャッシュの効果が高くなることです。
その一方で、単一のグループが全てのバンドルを含むために、結合された CSS と JavaScript のファイルはより大きくなり、従って最初のファイル転送時間はより長くなります。
この例では話を簡単にするために、最初の方法、すなわち、全てのバンドルを含む単一のグループを使用することにします。
> Info: アセット・バンドルをグループに分けることは些細な仕事ではありません。
通常、そのためには、いろいろなページのさまざまなアセットの現実世界での転送量を分析することが必要になります。
> Info: アセット・バンドルをグループに分けることは些細な仕事ではありません。通常、そのためには、いろいろなページのさまざまなアセットの現実世界での転送量を分析することが必要になります。
とりあえず、最初は、簡単にするために、単一のグループから始めて良いでしょう。
既存のツール (例えば [Closure Compiler](https://developers.google.com/closure/compiler/) や [YUI Compressor](https://github.com/yui/yuicompressor/)) を使って、全てのバンドルにある CSS と JavaScript のファイルを結合して圧縮します。
既存のツール (例えば [Closure Compiler](https://developers.google.com/closure/compiler/) や [YUI Compressor](https://github.com/yui/yuicompressor/)) を使って、
全てのバンドルにある CSS と JavaScript のファイルを結合して圧縮します。
ファイルは、バンドル間の依存関係を満たす順序に従って結合しなければならないことに注意してください。
例えば、バンドル A が B に依存し、B が C と D の両方に依存している場合は、アセット・ファイルの結合順は、最初に C と D、次に B、そして最後に A としなければなりません。
例えば、バンドル A が B に依存し、B が C と D の両方に依存している場合は、アセット・ファイルの結合順は、
最初に C と D、次に B、そして最後に A としなければなりません。
結合と圧縮が完了すると、一つの CSS ファイルと一つの JavaScript ファイルが得られます。
それらは、`all-xyz.css` および `all-xyz.js` と命名されたとしましょう。
@ -704,10 +745,12 @@ return [
];
```
つまり、アセット・バンドルの構成情報配列は、本番モードのものは `assets-prod.php` に保存し、開発モードのものは `assets-dev.php` に保存するという訳です。
つまり、アセット・バンドルの構成情報配列は、本番モードのものは `assets-prod.php` に保存し、
開発モードのものは `assets-dev.php` に保存するという訳です。
> Note: このアセット結合のメカニズムは、登録されるアセット・バンドルのプロパティをオーバーライドできるという [[yii\web\AssetManager::bundles]] の機能に基づいています。
しかし、既に上で述べたように、この機能は、[[yii\web\AssetBundle::init()]] メソッドの中やバンドルが登録された後で実行されるアセット・バンドルの修正をカバーしていません。
しかし、既に上で述べたように、この機能は、[[yii\web\AssetBundle::init()]]
メソッドの中やバンドルが登録された後で実行されるアセット・バンドルの修正をカバーしていません。
そのような動的なバンドルの使用は、アセット結合をする際には避けなければなりません。
@ -715,7 +758,8 @@ return [
Yii は、たった今説明した方法を自動化するための `asset` という名前のコンソール・コマンドを提供しています。
このコマンドを使うためには、最初に構成情報ファイルを作成して、どのアセット・バンドルが結合されるか、そして、それらがどのようにグループ化されるかを記述しなければなりません。
このコマンドを使うためには、最初に構成情報ファイルを作成して、どのアセット・バンドルが結合されるか、
そして、それらがどのようにグループ化されるかを記述しなければなりません。
`asset/template` サブ・コマンドを使って最初にテンプレートを生成し、それをあなたの要求に合うように修正することが出来ます。
```
@ -763,24 +807,31 @@ return [
`targets` オプションでは、バンドルがどのようにグループに分割されるかを指定しなければなりません。
既に述べたように、一つまたは複数のグループを定義することが出来ます。
> Note: パス・エイリアス `@webroot` および `@web` はコンソール・アプリケーションでは利用できませんので、これらは構成情報の中で明示的に定義しなければなりません。
> Note: パス・エイリアス `@webroot` および `@web` はコンソール・アプリケーションでは利用できませんので、
これらは構成情報の中で明示的に定義しなければなりません。
JavaScript ファイルは結合され、圧縮されて `js/all-{hash}.js` に保存されます。ここで {hash} は、結果として作られたファイルのハッシュで置き換えられるものです。
JavaScript ファイルは結合され、圧縮されて `js/all-{hash}.js` に保存されます。ここで {hash} は、
結果として作られたファイルのハッシュで置き換えられるものです。
`jsCompressor``cssCompressor` のオプションは、JavaScript と CSS の結合/圧縮を実行するコンソールコマンドまたは PHP コールバックを指定するものです。
デフォルトでは、Yii は JavaScript ファイルの結合に [Closure Compiler](https://developers.google.com/closure/compiler/) を使い、CSS ファイルの結合に [YUI Compressor](https://github.com/yui/yuicompressor/) を使用します。
`jsCompressor``cssCompressor` のオプションは、JavaScript と CSS の結合/圧縮を実行するコンソール・コマンドまたは PHP コールバックを指定するものです。
デフォルトでは、Yii は JavaScript ファイルの結合に [Closure Compiler](https://developers.google.com/closure/compiler/) を使い、
CSS ファイルの結合に [YUI Compressor](https://github.com/yui/yuicompressor/) を使用します。
あなたの好みのツールを使うためには、手作業でツールをインストールしたり、オプションを修正したりしなければなりません。
この構成情報ファイルを使い、`asset` コマンドを走らせて、アセット・ファイルを結合して圧縮し、同時に、新しいアセット・バンドルの構成情報ファイル `assets-prod.php` を生成することが出来ます。
この構成情報ファイルを使い、`asset` コマンドを走らせて、アセット・ファイルを結合して圧縮し、
同時に、新しいアセット・バンドルの構成情報ファイル `assets-prod.php` を生成することが出来ます。
```
yii asset assets.php config/assets-prod.php
```
直前の項で説明したように、この生成された構成情報ファイルをアプリケーションの構成情報にインクルードすることが出来ます。
直前の項で説明したように、
この生成された構成情報ファイルをアプリケーションの構成情報にインクルードすることが出来ます。
> Note: アプリケーションのアセット・バンドルを [[yii\web\AssetManager::bundles]] または [[yii\web\AssetManager::assetMap]] によってカスタマイズしており、
そのカスタマイズを圧縮のソース・ファイルにも適用したい場合は、それらのオプションを `asset` コマンドの構成ファイルの `assetManager` のセクションに含めなければいけません。
そのカスタマイズを圧縮のソース・ファイルにも適用したい場合は、それらのオプションを `asset` コマンドの構成ファイルの
`assetManager` のセクションに含めなければいけません。
> Note: 圧縮のソースを指定する場合は、パラメータが動的に (例えば `init()` メソッドの中や登録後に) 修正されるアセット・バンドルを避けなければなりません。
なぜなら、パラメータの動的な修正は、圧縮後は正しく働かない可能性があるからです。
@ -794,7 +845,8 @@ yii asset assets.php config/assets-prod.php
直前の項において、全てのアセット・バンドルを一つに結合して、アプリケーションで参照されるアセット・ファイルに対する HTTP リクエストを最小化する方法を説明しました。
現実には、それが常に望ましいわけではありません。
例えば、あなたのアプリケーションがフロントエンドとバックエンドを持っており、それぞれが異なる一群の JavaScript と CSS ファイルを使う場合を想像してください。
例えば、あなたのアプリケーションがフロントエンドとバックエンドを持っており、
それぞれが異なる一群の JavaScript と CSS ファイルを使う場合を想像してください。
この場合、両方の側の全てのアセット・バンドルを一つに結合するのは合理的ではありません。
何故なら、フロントエンドのためのアセット・バンドルはバックエンドでは使用されませんから、フロントエンドのページがリクエストされているときにバックエンドのアセットを送信するのはネットワーク帯域の浪費です。
@ -834,9 +886,8 @@ return [
```
ご覧のように、アセット・バンドルは三つのグループ、すなわち、`allShared`、`allBackEnd` および `allFrontEnd` に分けられています。
そして、それぞれが適切な一群のアセット・バンドルに依存しています。
例えば、`allBackEnd` は `app\assets\AdminAsset` に依存しています。
そして、それぞれが適切な一群のアセット・バンドルに依存しています。例えば、`allBackEnd` は `app\assets\AdminAsset` に依存しています。
この構成情報によって `asset` コマンドを実行すると、上記の定義に従ってアセット・バンドルが結合されます。
> Info: ターゲット・バンドルのうちの一つについて `depends` の構成を空のままにしておくことが出来ます。
そのようにすると、他のターゲットバンドルが依存しないために残された全てのアセット・バンドルが、このターゲット・バンドルに含まれるようになります。
そのようにすると、他のターゲットバンドルが依存しないために残された全てのアセット・バンドルが、このターゲット・バンドルに含まれるようになります。

101
docs/guide-ja/structure-controllers.md

@ -3,7 +3,9 @@
コントローラは [MVC](http://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。
それは [[yii\base\Controller]] を拡張したクラスのオブジェクトであり、リクエストの処理とレスポンスの生成について責任を負います。
具体的には、[アプリケーション](structure-applications.md) から制御を引き継いだ後、コントローラは入ってきたリクエストのデータを分析し、それを [モデル](structure-models.md) に引き渡して、モデルが生成した結果を [ビュー](structure-views.md) に投入し、最終的に外に出て行くレスポンスを生成します。
具体的には、コントローラは、[アプリケーション](structure-applications.md) から制御を引き継いだ後、
入ってきたリクエストのデータを分析し、それを [モデル](structure-models.md) に引き渡して、
モデルが生成した結果を [ビュー](structure-views.md) に投入し、最終的に外に出て行くレスポンスを生成します。
## アクション <span id="actions"></span>
@ -62,11 +64,11 @@ class PostController extends Controller
## ルート <span id="routes"></span>
エンド・ユーザは、いわゆる *ルート* によって、アクションのアドレスを指定します。
ルートは、次の部分からなる文字列です。
エンド・ユーザは、いわゆる *ルート* によって、アクションを指定します。ルートは、次の部分からなる文字列です。
* モジュール ID: この部分は、コントローラがアプリケーションではない [モジュール](structure-modules.md) に属する場合にのみ存在します。
* [コントローラ ID]((#controller-ids): 同じアプリケーション (または、コントローラがモジュールに属する場合は、同じモジュール) に属する全てのコントローラの中から、コントローラを一意に特定する文字列。
* [コントローラ ID]((#controller-ids): 同じアプリケーション (または、コントローラがモジュールに属する場合は、同じモジュール)
に属する全てのコントローラの中から、コントローラを一意に特定する文字列。
* [アクション ID](#action-ids): 同じコントローラに属する全てのアクションの中から、アクションを一意に特定する文字列。
ルートは次の形式を取ります。
@ -81,7 +83,8 @@ ControllerID/ActionID
ModuleID/ControllerID/ActionID
```
ですから、ユーザが `http://hostname/index.php?r=site/index` という URL でリクエストをした場合は、`site` コントローラの中の `index` アクションが実行されます。
ですから、ユーザが `http://hostname/index.php?r=site/index` という URL でリクエストをした場合は、
`site` コントローラの中の `index` アクションが実行されます。
ルートがどのようにしてアクションとして解決されるかについての詳細は、[ルーティングと URL 生成](runtime-routing.md) のセクションを参照してください。
@ -109,7 +112,8 @@ class SiteController extends Controller
例えば、記事データを処理するコントローラの ID としては、`article` を使うことが出来ます。
デフォルトでは、コントローラ ID は、小文字の英字、数字、アンダースコア、ダッシュ、および、フォワード・スラッシュのみを含むべきものです。
例えば、`article` と `post-comment` はともに有効なコントローラ ID ですが、`article?`、`PostComment`、`admin\post` はそうではありません。
例えば、`article` と `post-comment` はともに有効なコントローラ ID ですが、
`article?`、`PostComment`、`admin\post` はそうではありません。
コントローラ ID は、サブ・ディレクトリの接頭辞を含んでも構いません。
例えば、`admin/article` は、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] の下の `admin` サブ・ディレクトリにある `article` コントローラを表します。
@ -127,7 +131,8 @@ class SiteController extends Controller
3. 接尾辞 `Controller` を追加する。
4. [[yii\base\Application::controllerNamespace|コントローラ名前空間]] を頭に付ける。
以下は、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] がデフォルト値 `app\controllers` を取っていると仮定したときの、いくつかの例です。
以下は、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] がデフォルト値 `app\controllers`
を取っていると仮定したときの、いくつかの例です。
* `article``app\controllers\ArticleController` になる。
* `post-comment``app\controllers\PostCommentController` になる。
@ -135,19 +140,23 @@ class SiteController extends Controller
* `adminPanels/post-comment``app\controllers\adminPanels\PostCommentController` になる。
コントローラ・クラスは [オートロード可能](concept-autoloading.md) でなければなりません。
この理由により、上記の例の `aritcle` コントローラ・クラスは [エイリアス](concept-aliases.md) が `@app/controllers/ArticleController.php` であるファイルに保存されるべきものとなります。
この理由により、上記の例の `aritcle` コントローラ・クラスは [エイリアス](concept-aliases.md) が
`@app/controllers/ArticleController.php` であるファイルに保存されるべきものとなります。
一方、`admin/post-comment` コントローラは `@app/controllers/admin/PostCommentController.php` というエイリアスのファイルに保存されるべきものとなります。
> Info: 最後の例である `admin/post-comment` は、どうすれば [[yii\base\Application::controllerNamespace|コントローラ名前空間]] のサブ・ディレクトリにコントローラを置くことが出来るかを示しています。
> Info: 最後の例である `admin/post-comment` は、どうすれば [[yii\base\Application::controllerNamespace|コントローラ名前空間]]
のサブ・ディレクトリにコントローラを置くことが出来るかを示しています。
この方法は、コントローラをいくつかのカテゴリに分けて編成したい、けれども [モジュール](structure-modules.md) は使いたくない、という場合に役立ちます。
### コントローラ・マップ <span id="controller-map"></span>
[[yii\base\Application::controllerMap|コントローラ・マップ]] を構成すると、上で述べたコントローラ ID とクラス名の制約を乗り越えることが出来ます。
これは、主として、クラス名に対する制御が及ばないサードパーティのコントローラを使おうとする場合に有用です。
[[yii\base\Application::controllerMap|コントローラ・マップ]] を構成すると、上で述べたコントローラ ID
とクラス名の制約を乗り越えることが出来ます。
これは、主として、クラス名に対する制御が及ばないサード・パーティのコントローラを使おうとする場合に有用です。
[[yii\base\Application::controllerMap|コントローラ・マップ]] は [アプリケーションの構成情報](structure-applications.md#application-configurations) の中で、次のように構成することが出来ます。
[[yii\base\Application::controllerMap|コントローラ・マップ]] は [アプリケーションの構成情報](structure-applications.md#application-configurations)
の中で、次のように構成することが出来ます。
```php
[
@ -185,8 +194,7 @@ class SiteController extends Controller
アクションは、コントローラ・クラスの中にいわゆる *アクション・メソッド* を定義するだけで簡単に作成することが出来ます。
アクション・メソッドとは、`action` という語で始まる名前を持つ *public* メソッドのことです。
アクション・メソッドの返り値がエンド・ユーザに送信されるレスポンス・データを表します。
次のコードは、`index` と `hello-world` という二つのアクションを定義するものです。
アクション・メソッドの返り値がエンド・ユーザに送信されるレスポンス・データを表します。次のコードは、`index` と `hello-world` という二つのアクションを定義するものです。
```php
namespace app\controllers;
@ -218,7 +226,8 @@ class SiteController extends Controller
例えば、`view`、`update2`、`comment-post` は全て有効なアクション ID ですが、`view?`、`Update` はそうではありません。
アクションは二つの方法、すなわち、インライン・アクションまたはスタンドアロン・アクションとして作成することが出来ます。
インライン・アクションはコントローラ・クラスのメソッドとして定義されるものであり、一方、スタンドアロン・アクションは [[yii\base\Action]] またはその子クラスを拡張するクラスです。
インライン・アクションはコントローラ・クラスのメソッドとして定義されるものであり、
一方、スタンドアロン・アクションは [[yii\base\Action]] またはその子クラスを拡張するクラスです。
インライン・アクションは作成するのにより少ない労力を要するため、通常は、アクションを再利用する意図がない場合に推奨されます。
もう一方のスタンドアロン・アクションは、主として、さまざまなコントローラの中で使われることや、[エクステンション](structure-extensions.md) として再配布されることを目的として作成されます。
@ -242,15 +251,18 @@ class SiteController extends Controller
インライン・アクションは作成するのにほとんど労力を要さないため、たいていのアクションはインライン・アクションとして定義されます。
しかし、同じアクションを別の場所で再利用する計画を持っていたり、また、アクションを再配布したいと思っていたりする場合は、アクションを *スタンドアロン・アクション* として定義することを検討すべきです。
しかし、同じアクションを別の場所で再利用する計画を持っていたり、また、アクションを再配布したいと思っていたりする場合は、
アクションを *スタンドアロン・アクション* として定義することを検討すべきです。
### スタンドアロン・アクション <span id="standalone-actions"></span>
スタンドアロン・アクションは、[[yii\base\Action]] またはその子クラスを拡張するアクション・クラスの形で定義されるものです。
例えば、Yii のリリースに [[yii\web\ViewAction]] と [[yii\web\ErrorAction]] が含まれていますが、これらは両方ともスタンドアロン・アクションです。
例えば、Yii のリリースに [[yii\web\ViewAction]] と [[yii\web\ErrorAction]] が含まれていますが、
これらは両方ともスタンドアロン・アクションです。
スタンドアロン・アクションを使用するためには、下記のように、コントローラの [[yii\base\Controller::actions()]] メソッドをオーバーライドして、*アクション・マップ* の中でスタンドアロン・アクションを宣言しなければなりません。
スタンドアロン・アクションを使用するためには、下記のように、コントローラの [[yii\base\Controller::actions()]] メソッドをオーバーライドして、
*アクション・マップ* の中でスタンドアロン・アクションを宣言しなければなりません。
```php
public function actions()
@ -268,11 +280,12 @@ public function actions()
}
```
ご覧のように、`actions()` メソッドは、キーがアクション ID であり、値が対応するアクションのクラス名または [構成情報](concept-configurations.md) である配列を返さなければなりません。
ご覧のように、`actions()` メソッドは、キーがアクション ID であり、値が対応するアクションのクラス名または
[構成情報](concept-configurations.md) である配列を返さなければなりません。
インライン・アクションと違って、スタンドアロン・アクションのアクション ID は、`actions()` メソッドにおいて宣言される限りにおいて、任意の文字を含むことが出来ます。
スタンドアロン・アクション・クラスを作成するためには、[[yii\base\Action]] またはその子クラスを拡張して、`run()` という名前の public メソッドを実装しなければなりません。
`run()` メソッドの役割はアクション・メソッドのそれと似たようなものです。例えば、
`run()` メソッドの役割はアクション・メソッドの役割と同じです。例えば、
```php
<?php
@ -297,11 +310,14 @@ class HelloWorldAction extends Action
返り値は、エンド・ユーザにレスポンスとして送信される [レスポンス](runtime-responses.md) オブジェクトとすることが出来ます。
* [[yii\web\Application|ウェブ・アプリケーション]] では、返り値を [[yii\web\Response::data]] に割り当てられる任意のデータとすることも出来ます。このデータは、後に、レスポンスの本文を表す文字列へと変換されます。
* [[yii\console\Application|コンソール・アプリケーション]] では、返り値をコマンド実行の [[yii\console\Response::exitStatus|終了ステータス]] を示す整数とすることも出来ます。
* [[yii\web\Application|ウェブ・アプリケーション]] では、返り値を [[yii\web\Response::data]] に割り当てられる任意のデータとすることも出来ます。
このデータは、後に、レスポンス・ボディを表す文字列へと変換されます。
* [[yii\console\Application|コンソール・アプリケーション]] では、返り値をコマンド実行の
[[yii\console\Response::exitStatus|終了ステータス]] を示す整数とすることも出来ます。
これまでに示した例においては、アクションの結果はすべて文字列であり、エンド・ユーザに送信されるレスポンスの本文として扱われるものでした。
次の例では、アクションがレスポンス・オブジェクトを返すことによって、ユーザのブラウザを新しい URL にリダイレクトすることが出来る様子が示されています
これまでに示した例においては、アクションの結果はすべて文字列であり、エンド・ユーザに送信されるレスポンス・ボディとして扱われるものでした。
次の例では、アクションがレスポンス・オブジェクトを返すことによって、ユーザのブラウザを
新しい URL にリダイレクトすることが出来る様子が示されています
([[yii\web\Controller::redirect()|redirect()]] メソッドの返り値はレスポンス・オブジェクトです)。
```php
@ -340,9 +356,12 @@ class PostController extends Controller
* `http://hostname/index.php?r=post/view&id=123`: `$id` パラメータには `'123'` という値が入れられます。
一方、`version` というクエリ・パラメータは無いので、`$version` は `null` のままになります。
* `http://hostname/index.php?r=post/view&id=123&version=2`: `$id` および `$version` パラメータに、それぞれ、`'123'` と `'2'` が入ります。
* `http://hostname/index.php?r=post/view`: 必須の `$id` パラメータがリクエストで提供されていないため、 [[yii\web\BadRequestHttpException]] 例外が投げられます。
* `http://hostname/index.php?r=post/view&id[]=123`: `$id` パラメータが予期しない配列値 `['123']` を受け取ろうとするため、[[yii\web\BadRequestHttpException]] 例外が投げられます。
* `http://hostname/index.php?r=post/view&id=123&version=2`: `$id` および `$version` パラメータに、
それぞれ、`'123'` と `'2'` が入ります。
* `http://hostname/index.php?r=post/view`: 必須の `$id` パラメータがリクエストで提供されていないため、
[[yii\web\BadRequestHttpException]] 例外が投げられます。
* `http://hostname/index.php?r=post/view&id[]=123`: `$id` パラメータが予期しない配列値 `['123']` を受け取ろうとするため、
[[yii\web\BadRequestHttpException]] 例外が投げられます。
アクション・パラメータに配列値を受け取らせたい場合は、次のように、パラメータに `array` の型ヒントを付けなければなりません。
@ -354,7 +373,8 @@ public function actionView(array $id, $version = null)
```
このようにすると、リクエストが `http://hostname/index.php?r=post/view&id[]=123` である場合は、`$id` パラメータは `['123']` という値を受け取ります。
リクエストが `http://hostname/index.php?r=post/view&id=123` である場合も、スカラ値 `'123'` が自動的に配列に変換されるため、`$id` パラメータは引き続き同じ配列値を受け取ります。
リクエストが `http://hostname/index.php?r=post/view&id=123` である場合も、スカラ値 `'123'` が自動的に配列に変換されるため、
`$id` パラメータは引き続き同じ配列値を受け取ります。
上記の例は主としてウェブ・アプリケーションでのアクション・パラメータの動作を示すものです。
コンソール・アプリケーションについては、[コンソール・コマンド](tutorial-console.md) のセクションで詳細を参照してください。
@ -363,7 +383,8 @@ public function actionView(array $id, $version = null)
### デフォルト・アクション <span id="default-action"></span>
すべてのコントローラは、それぞれ、[[yii\base\Controller::defaultAction]] によって指定されるデフォルト・アクションを持ちます。
[ルート](#routes) がコントローラ ID のみを含む場合は、指定されたコントローラのデフォルト・アクションがリクエストされたことを意味します。
[ルート](#routes) がコントローラ ID のみを含む場合は、
指定されたコントローラのデフォルト・アクションがリクエストされたことを意味します。
デフォルトでは、デフォルト・アクションは `index` と設定されます。
このデフォルト値を変更したい場合は、以下のように、コントローラ・クラスでこのプロパティをオーバーライドするだけです。
@ -385,30 +406,36 @@ class SiteController extends Controller
```
## コントローラのライフサイクル <span id="controller-lifecycle"></span>
## コントローラのライフサイクル <span id="controller-lifecycle"></span>
リクエストを処理するときに、[アプリケーション](structure-applications.md) はリクエストされた [ルート](#routes) に基いてコントローラを作成します。
そして、次に、コントローラはリクエストに応じるために以下のライフ・サイクルを経過します。
リクエストを処理するときに、[アプリケーション](structure-applications.md) はリクエストされた [ルート](#routes)
に基いてコントローラを作成します。
そして、次に、コントローラはリクエストに応じるために以下のライフサイクルを経過します。
1. コントローラが作成され構成された後、[[yii\base\Controller::init()]] メソッドが呼ばれる。
2. コントローラは、リクエストされたアクション ID に基いて、アクション・オブジェクトを作成する。
* アクション ID が指定されていないときは、[[yii\base\Controller::defaultAction|デフォルト・アクション ID]] が使われる。
* アクション ID が [[yii\base\Controller::actions()|アクション・マップ]] の中に見つかった場合は、スタンドアロン・アクションが作成される。
* アクション ID が [[yii\base\Controller::actions()|アクション・マップ]] の中に見つかった場合は、
スタンドアロン・アクションが作成される。
* アクション ID に合致するアクション・メソッドが見つかった場合は、インライン・アクションが作成される。
* 上記以外の場合は、[[yii\base\InvalidRouteException]] 例外が投げられる。
3. コントローラは、アプリケーション、(コントローラがモジュールに属する場合は) モジュール、そしてコントローラの `beforeAction()` メソッドをこの順で呼び出す。
* どれか一つの呼び出しが `false` を返した場合は、残りのまだ呼ばれていない `beforeAction()` メソッドはスキップされ、アクションの実行はキャンセルされる。
3. コントローラは、アプリケーション、(コントローラがモジュールに属する場合は) モジュール、
そしてコントローラの `beforeAction()` メソッドをこの順で呼び出す。
* どれか一つの呼び出しが `false` を返した場合は、残りのまだ呼ばれていない `beforeAction()` メソッドはスキップされ、
アクションの実行はキャンセルされる。
* デフォルトでは、それぞれの `beforeAction()` メソッドは、ハンドラをアタッチすることが可能な `beforeAction` イベントをトリガする。
4. コントローラがアクションを実行する。
* アクション・パラメータが解析されて、リクエスト・データからデータが投入される。
5. コントローラは、コントローラ、(コントローラがモジュールに属する場合は) モジュール、そしてアプリケーションの `afterAction()` メソッドをこの順で呼び出す。
5. コントローラは、コントローラ、(コントローラがモジュールに属する場合は) モジュール、
そしてアプリケーションの `afterAction()` メソッドをこの順で呼び出す。
* デフォルトでは、それぞれの `afterAction()` メソッドは、ハンドラをアタッチすることが可能な `afterAction` イベントをトリガする。
6. アプリケーションはアクションの結果を受け取り、それを [レスポンス](runtime-responses.md) に割り当てる。
## ベスト・プラクティス <span id="best-practices"></span>
良く設計されたアプリケーションでは、コントローラはたいてい非常に軽いものになり、それぞれのアクションは数行のコードしか含まないものになります。
良く設計されたアプリケーションでは、コントローラはたいてい非常に軽いものになり、
それぞれのアクションは数行のコードしか含まないものになります。
あなたのコントローラが少々複雑になっている場合、そのことは、通常、コントローラをリファクタして、コードの一部を他のクラスに移動すべきことを示すものです。
いくつかのベスト・プラクティスを特に挙げるなら、コントローラは、

15
docs/guide-ja/structure-entry-scripts.md

@ -5,11 +5,13 @@
アプリケーションは (ウェブ・アプリケーションであれ、コンソール・アプリケーションであれ)単一のエントリ・スクリプトを持ちます。
エンド・ユーザはエントリ・スクリプトに対してリクエストを発行し、エントリ・スクリプトはアプリケーションのインスタンスを作成して、それにリクエストを送付します。
ウェブ・アプリケーションのエントリ・スクリプトは、エンド・ユーザからアクセス出来るように、ウェブからのアクセスが可能なディレクトリの下に保管されなければなりません。
ウェブ・アプリケーションのエントリ・スクリプトは、エンド・ユーザからアクセス出来るように、
ウェブからのアクセスが可能なディレクトリの下に保管されなければなりません。
たいていは `index.php` と名付けられますが、ウェブ・サーバが見つけることが出来る限り、どのような名前を使っても構いません。
コンソール・アプリケーションのエントリ・スクリプトは、通常は、アプリケーションの [ベース・パス](structure-applications.md) の下に保管され、`yii` と名付けられます (`.php` の拡張子を伴います) 。
これは、ユーザが `./yii <route> [引数] [オプション]` というコマンドによってコンソール・アプリケーションを走らせることが出来るようにするためのスクリプトであり、実行可能なパーミッションを与えられるべきものです。
これは、ユーザが `./yii <route> [引数] [オプション]` というコマンドによってコンソール・アプリケーションを走らせることが出来るようにするためのスクリプトであり、
実行可能なパーミッションを与えられるべきものです。
エントリ・スクリプトは主として次の仕事をします。
@ -80,13 +82,11 @@ exit($exitCode);
## 定数を定義する<span id="defining-constants"></span>
グローバルな定数を定義するには、エントリ・スクリプトが最善の場所です。
Yii は下記の三つの定数をサポートしています。
グローバルな定数を定義するには、エントリ・スクリプトが最善の場所です。Yii は下記の三つの定数をサポートしています。
* `YII_DEBUG`: アプリケーションがデバッグ・モードで走るかどうかを指定します。
デバッグ・モードにおいては、アプリケーションはより多くのログ情報を保持し、例外が投げられたときに、より詳細なエラーのコール・スタックを表示します。
この理由により、デバッグ・モードは主として開発時に使用されるべきものとなります。
`YII_DEBUG` のデフォルト値は `false` です。
この理由により、デバッグ・モードは主として開発時に使用されるべきものとなります。`YII_DEBUG` のデフォルト値は `false` です。
* `YII_ENV`: どういう環境でアプリケーションが走っているかを指定します。
詳細は、[構成情報](concept-configurations.md#environment-constants) のセクションで説明されます。
`YII_ENV` のデフォルト値は `'prod'` であり、アプリケーションが本番環境で走っていることを意味します。
@ -109,4 +109,5 @@ if (!defined('YII_DEBUG')) {
明らかに前者の方が簡潔で理解しやすいでしょう。
他のPHP ファイルがインクルードされる時に定数の効力が生じるようにするために、定数はエントリ・スクリプトの冒頭で定義されなければなりません。
他のPHP ファイルがインクルードされる時に定数の効力が生じるようにするために、
定数はエントリ・スクリプトの冒頭で定義されなければなりません。

132
docs/guide-ja/structure-extensions.md

@ -2,12 +2,14 @@
================
エクステンションは、Yii のアプリケーションで使われることに限定して設計され、そのまますぐに使える機能を提供する再配布可能なソフトウェア・パッケージです。
例えば、[yiisoft/yii2-debug](https://github.com/yiisoft/yii2-debug) エクステンションは、あなたのアプリケーションにおいて、全てのページの末尾に便利なデバッグ・ツール・バーを追加して、ページが生成される過程をより容易に把握できるように手助けしてくれます。
例えば、[yiisoft/yii2-debug](https://github.com/yiisoft/yii2-debug) エクステンションは、あなたのアプリケーションにおいて、全てのページの末尾に便利なデバッグ・ツールバーを追加して、
ページが生成される過程をより容易に把握できるように手助けしてくれます。
エクステンションを使うと、あなたの開発プロセスを加速することが出来ます。
また、あなたのコードをエクステンションとしてパッケージ化すると、あなたの優れた仕事を他の人たちと共有することが出来ます。
> Info: 「エクステンション」という用語は Yii に限定されたソフトウェアパッケージを指すものとして使用します。
Yii がなくても使用できる汎用のソフトウェアパッケージを指すためには、「パッケージ」または「ライブラリ」という用語を使うことにします。
> Info: 「エクステンション」という用語は Yii に限定されたソフトウェア・パッケージを指すものとして使用します。
Yii がなくても使用できる汎用のソフトウェア・パッケージを指すためには、「パッケージ」または「ライブラリ」という用語を使うことにします。
## エクステンションを使う <span id="using-extensions"></span>
@ -19,7 +21,7 @@
[Composer](https://getcomposer.org/) を持っていない場合は、それをインストールする必要があることに注意してください。
デフォルトでは、Composer はオープンソース Composer パッケージの最大のレポジトリである [Packagist](https://packagist.org/) に登録されたパッケージをインストールします。
デフォルトでは、Composer はオープンソース Composer パッケージの最大のレポジトリである [Packagist](https://packagist.org/) に登録されたパッケージをインストールします。
エクステンションは Packagist で探すことが出来ます。
また、[自分自身のレポジトリを作成](https://getcomposer.org/doc/05-repositories.md#repository) して、それを使うように Composer を構成することも出来ます。
これは、あなたがプライベートなエクステンションを開発していて、それを自分のプロジェクト間でのみ共有したい場合に役に立つ方法です。
@ -37,7 +39,7 @@ Composer は依存関係を管理するものですから、あるパッケー
"require": {
// ... 他の依存パッケージ
"yiisoft/yii2-imagine": "~2.0.0"
"yiisoft/yii2-imagine": "*"
}
}
```
@ -45,8 +47,8 @@ Composer は依存関係を管理するものですから、あるパッケー
インストール完了後には、`BasePath/vendor` の下に `yiisoft/yii2-imagine` ディレクトリが作られている筈です。
それと同時に、`imagine/imagine` という別のディレクトリも作られて、依存するパッケージがそこにインストールされている筈です。
> Info: `yiisoft/yii2-imagine` は Yii 開発チームによって開発され保守されるコアエクステンションの一つです。
全てのコアエクステンションは [Packagist](https://packagist.org/) でホストされ、`yiisoft/yii2-xyz` のように名付けられます。
> Info: `yiisoft/yii2-imagine` は Yii 開発チームによって開発され保守されるコアエクステンションの一つです。
全てのコアエクステンションは [Packagist](https://packagist.org/) でホストされ、`yiisoft/yii2-xyz` のように名付けられます。
ここで `xyz` はエクステンションによってさまざまに変ります。
これであなたはインストールされたエクステンションをあなたのアプリケーションの一部であるかのように使うことが出来ます。
@ -108,8 +110,7 @@ Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
### `composer.json` <span id="composer-json"></span>
全ての Composer パッケージは、ルート・ディレクトリに `composer.json` というファイルを持たなければなりません。
このファイルはパッケージに関するメタデータを含むものです。
全ての Composer パッケージは、ルート・ディレクトリに `composer.json` というファイルを持たなければなりません。このファイルはパッケージに関するメタデータを含むものです。
このファイルに関する完全な仕様は [Composer Manual](https://getcomposer.org/doc/01-basic-usage.md#composer-json-project-setup) に記載されています。
次の例は、`yiisoft/yii2-imagine` エクステンションのための `composer.json` ファイルを示すものです。
@ -170,22 +171,23 @@ Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
パッケージがインストールされたときに Yii のエクステンションとして認識されるように、エクステンションのパッケージ・タイプを `yii2-extension` と指定することは重要なことです。
ユーザが `composer install` を走らせてエクステンションをインストールすると、`vendor/yiisoft/extensions.php` というファイルが自動的に更新されて、新しいエクステンションに関する情報を含むようになります。
ユーザが `composer install` を走らせてエクステンションをインストールすると、
`vendor/yiisoft/extensions.php` というファイルが自動的に更新されて、新しいエクステンションに関する情報を含むようになります。
Yii のアプリケーションは、このファイルによって、どんなエクステンションがインストールされているかを知ることが出来ます
(その情報には、[[yii\base\Application::extensions]] を通じてアクセスすることが出来ます)。
#### 依存パッケージ <span id="dependencies"></span>
あなたのエクステンションは Yii に依存します (当然ですね)。
ですから、`composer.json` の `require` エントリのリストにそれ (`yiisoft/yii2`) を挙げなければなりません。
あなたのエクステンションがその他のエクステンションやサードパーティのライブラリに依存する場合は、それらもリストに挙げなければなりません。
あなたのエクステンションは Yii に依存します (当然ですね)。ですから、`composer.json` の `require` エントリのリストにそれ (`yiisoft/yii2`) を挙げなければなりません。
あなたのエクステンションがその他のエクステンションやサード・パーティのライブラリに依存する場合は、それらもリストに挙げなければなりません。
それぞれの依存パッケージについて、適切なバージョン制約 (例えば `1.*``@stable`) を指定することも忘れてはなりません。
あなたのエクステンションを安定バージョンとしてリリースする場合は、安定した依存パッケージを使ってください。
たいていの JavaScript/CSS パッケージは、Composer ではなく、[Bower](http://bower.io/) および/または [NPM](https://www.npmjs.org/) を使って管理されています。
Yii は [Composer アセット・プラグイン](https://github.com/francoispluchino/composer-asset-plugin) を使って、この種のパッケージを Composer によって管理することを可能にしています。
あなたのエクステンションが Bower パッケージに依存している場合でも、次のように、`composer.json` に依存パッケージをリストアップすることが簡単に出来ます。
あなたのエクステンションが Bower パッケージに依存している場合でも、次のように、
`composer.json` に依存パッケージをリストアップすることが簡単に出来ます。
```json
{
@ -207,7 +209,8 @@ Composer が Bower または NPM のパッケージをインストールする
#### クラスのオートロード <span id="class-autoloading"></span>
エクステンションのクラスが Yii のクラス・オートローダまたは Composer のクラス・オートローダによってオートロードされるように、下記に示すように、`composer.json` ファイルの `autoload` エントリを指定しなければなりません。
エクステンションのクラスが Yii のクラス・オートローダまたは Composer のクラス・オートローダによってオートロードされるように、
下記に示すように、`composer.json` ファイルの `autoload` エントリを指定しなければなりません。
```json
{
@ -223,7 +226,8 @@ Composer が Bower または NPM のパッケージをインストールする
一つまたは複数のルート名前空間と、それに対応するファイル・パスをリストに挙げることが出来ます。
エクステンションがアプリケーションにインストールされると、Yii は列挙されたルート名前空間の一つ一つに対して、名前空間に対応するディレクトリを指す [エイリアス](concept-aliases.md#extension-aliases) を作成します。
エクステンションがアプリケーションにインストールされると、Yii は列挙されたルート名前空間の一つ一つに対して、
名前空間に対応するディレクトリを指す [エイリアス](concept-aliases.md#extension-aliases) を作成します。
例えば、上記の `autoload` の宣言は、`@yii/imagine` という名前のエイリアスに対応することになります。
@ -235,20 +239,23 @@ Composer が Bower または NPM のパッケージをインストールする
#### 名前空間 <span id="namespaces"></span>
名前の衝突を避けて、エクステンションの中のクラスをオートロード可能にするために、名前空間を使うべきであり、エクステンションの中のクラスには [PSR-4 標準](http://www.php-fig.org/psr/psr-4/) または [PSR-0 標準](http://www.php-fig.org/psr/psr-0/) に従った名前を付けるべきです。
名前の衝突を避けて、エクステンションの中のクラスをオートロード可能にするために、名前空間を使うべきであり、
エクステンションの中のクラスには [PSR-4 標準](http://www.php-fig.org/psr/psr-4/) または [PSR-0 標準](http://www.php-fig.org/psr/psr-0/)
に従った名前を付けるべきです。
あなたのクラスの名前空間は `vendorName\extensionName` で始まるべきです。
ここで `extensionName` は、`yii2-` という接頭辞を含むべきでないことを除けば、パッケージ名におけるプロジェクト名と同じものです。
例えば、`yiisoft/yii2-imagine` エクステンションでは、`yii\imagine` をエクステンションのクラスの名前空間として使っています。
`yii`、`yii2` または `yiisoft` をベンダー名として使ってはいけません。これらの名前は、Yii のコアコードに使うために予約されています。
`yii`、`yii2` または `yiisoft` をベンダー名として使ってはいけません。これらの名前は、Yii のコアコードに使うために予約されています。
#### ブートストラップ・クラス <span id="bootstrapping-classes"></span>
場合によっては、アプリケーションが [ブートストラップ](runtime-bootstrapping.md) の段階にある間に、エクステンションに何らかのコードを実行させたい場合があるでしょう。
例えば、エクステンションをアプリケーションの `beginRequest` イベントに反応させて、何らかの環境設定を調整したいことがあります。
エクステンションのユーザに対して、エクステンションの中にあるイベント・ハンドラを `beginRequest` イベントに明示的にアタッチするように指示することも出来ますが、より良い方法は、それを自動的に行うことです。
エクステンションのユーザに対して、エクステンションの中にあるイベント・ハンドラを `beginRequest`
イベントに明示的にアタッチするように指示することも出来ますが、より良い方法は、それを自動的に行うことです。
この目的を達するためには、[[yii\base\BootstrapInterface]] を実装する、いわゆる *ブートストラップ・クラス* を作成します。
例えば、
@ -282,13 +289,14 @@ class MyBootstrapClass implements BootstrapInterface
}
```
このエクステンションがアプリケーションにインストールされると、すべてのリクエストのブートストラップの過程において、毎回、Yii が自動的にブートストラップ・クラスのインスタンスを作成し、その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドを呼びます。
このエクステンションがアプリケーションにインストールされると、すべてのリクエストのブートストラップの過程において、
毎回、Yii が自動的にブートストラップ・クラスのインスタンスを作成し、
その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドを呼びます。
#### データベースを扱う <span id="working-with-databases"></span>
あなたのエクステンションはデータベースにアクセスする必要があるかも知れません。
エクステンションを使うアプリケーションが常に `Yii::$db` を DB 接続として使用すると仮定してはいけません。
あなたのエクステンションはデータベースにアクセスする必要があるかも知れません。エクステンションを使うアプリケーションが常に `Yii::$db` を DB 接続として使用すると仮定してはいけません。
その代りに、DB アクセスを必要とするクラスのために `db` プロパティを宣言すべきです。
このプロパティによって、エクステンションのユーザは、エクステンションにどの DB 接続を使わせるかをカスタマイズすることが出来るようになります。
その一例として、[[yii\caching\DbCache]] クラスを参照して、それがどのように `db` プロパティを宣言して使っているかを見ることが出来ます。
@ -297,7 +305,7 @@ class MyBootstrapClass implements BootstrapInterface
- DB スキーマを操作するために、平文の SQL ファイルを使うのではなく、[マイグレーション](db-migrations.md) を提供する。
- マイグレーションがさまざまな DBMS に適用可能なものになるように試みる。
- マイグレーションの中では [アクティブレコード](db-active-record.md) の使用を避ける。
- マイグレーションの中では [アクティブレコード](db-active-record.md) の使用を避ける。
#### アセットを使う <span id="using-assets"></span>
@ -308,7 +316,8 @@ class MyBootstrapClass implements BootstrapInterface
そのため、次のどちらかの方法を使って、アセット・ファイルをウェブから直接アクセス出来るようにしなければなりません。
- アセット・ファイルをウェブからアクセス出来る特定のフォルダに手作業でコピーするように、エクステンションのユーザに要求する。
- [アセット・バンドル](structure-assets.md) を宣言し、アセット発行メカニズムに頼って、アセット・バンドルにリストされているファイルをウェブからアクセス出来るフォルダに自動的にコピーする。
- [アセット・バンドル](structure-assets.md) を宣言し、アセット発行メカニズムに頼って、
アセット・バンドルにリストされているファイルをウェブからアクセス出来るフォルダに自動的にコピーする。
あなたのエクステンションが他の人々にとって一層使いやすいものになるように、第二の方法をとることを推奨します。
アセットの取り扱い一般に関する詳細は [アセット](structure-assets.md) のセクションを参照してください。
@ -317,12 +326,13 @@ class MyBootstrapClass implements BootstrapInterface
#### 国際化と地域化 <span id="i18n-l10n"></span>
あなたのエクステンションは、さまざまな言語をサポートするアプリケーションによって使われるかもしれません。
従って、あなたのエクステンションがエンド・ユーザにコンテントを表示するものである場合は、それを [国際化](tutorial-i18n.md) するように努めるべきです。
具体的には、
従って、あなたのエクステンションがエンド・ユーザにコンテントを表示するものである場合は、それを [国際化](tutorial-i18n.md) するように努めるべきです。具体的には、
- エクステンションがエンド・ユーザに向けたメッセージを表示する場合は、翻訳することが出来るようにメッセージを `Yii::t()` で囲むべきです。
開発者に向けられたメッセージ (内部的な例外のメッセージなど) は翻訳される必要はありません。
- エクステンションが数値や日付などを表示する場合は、[[yii\i18n\Formatter]] を適切な書式化の規則とともに使って書式設定すべきです。
開発者に向けられたメッセージ (内部的な例外のメッセージなど)
は翻訳される必要はありません。
- エクステンションが数値や日付などを表示する場合は、
[[yii\i18n\Formatter]] を適切な書式化の規則とともに使って書式設定すべきです。
詳細については、[国際化](tutorial-i18n.md) のセクションを参照してください。
@ -333,7 +343,7 @@ class MyBootstrapClass implements BootstrapInterface
この目的を達するためには、あなたのエクステンションを公開する前にテストすべきです。
手作業のテストに頼るのではなく、あなたのエクステンションのコードをカバーするさまざまなテスト・ケースを作成することが推奨されます。
あなたのエクステンションの新しいバージョンを公開する前には、毎回、それらのテストケースを走らせるだけで、全てが良い状態にあることを確認することが出来ます。
あなたのエクステンションの新しいバージョンを公開する前には、毎回、それらのテストケースを走らせるだけで、全てが良い状態にあることを確認することが出来ます。
Yii はテストのサポートを提供しており、それよって、単体テスト、機能テスト、受入テストを書くことが一層簡単に出来るようになっています。
詳細については、[テスト](test-overview.md) のセクションを参照してください。
@ -349,20 +359,25 @@ Yii はテストのサポートを提供しており、それよって、単体
他の人々にあなたのエクステンションを知ってもらうためには、それをリリース(公開)する必要があります。
エクステンションをリリースするのが初めての場合は、[Packagist](https://packagist.org/) などの Composer レポジトリにエクステンションを登録するべきです。
その後は、あなたがしなければならない仕事は、エクステンションの VCS レポジトリでリリースタグ (例えば `v1.0.1`) を作成することと、Composer レポジトリに新しいリリースについて通知するだけのことになります。
その後は、あなたがしなければならない仕事は、エクステンションの VCS レポジトリでリリース・タグ (例えば `v1.0.1`) を作成することと、
Composer レポジトリに新しいリリースについて通知するだけのことになります。
そうすれば、人々が新しいリリースを見出すことが出来るようになり、Composer レポジトリを通じてエクステンションをインストールしたりアップデートしたりするようになります。
エクステンションのリリースには、コード・ファイル以外に、人々があなたのエクステンションについて知ったり、エクステンションを使ったりするのを助けるために、下記のものを含めることを考慮すべきです。
エクステンションのリリースには、コード・ファイル以外に、人々があなたのエクステンションについて知ったり、
エクステンションを使ったりするのを助けるために、下記のものを含めることを考慮すべきです。
* パッケージのルート・ディレクトリに readme ファイル: あなたのエクステンションが何をするものか、そして、どのようにインストールして使うものかを説明するものです。
* パッケージのルート・ディレクトリに readme ファイル: あなたのエクステンションが何をするものか、
そして、どのようにインストールして使うものかを説明するものです。
[Markdown](http://daringfireball.net/projects/markdown/) 形式で書いて、`readme.md` という名前にすることを推奨します。
* パッケージのルート・ディレクトリに changelog ファイル: それぞれのリリースで何が変ったかを一覧表示するものです。
このファイルは Markdown 形式で書いて `changelog.md` と名付けることが出来ます。
* パッケージのルート・ディレクトリに upgrade ファイル: エクステンションの古いリリースからのアップグレード方法について説明するものです。
このファイルは Markdown 形式で書いて `upgrade.md` と名付けることが出来ます。
* チュートリアル、デモ、スクリーン・ショットなど: あなたのエクステンションが readme ファイルでは十分にカバーできないほど多くの機能を提供するものである場合は、これらが必要になります。
* チュートリアル、デモ、スクリーン・ショットなど: あなたのエクステンションが readme ファイルでは十分にカバーできないほど多くの機能を提供するものである場合は、
これらが必要になります。
* API ドキュメント: あなたのコードは、他の人々が読んで理解することがより一層容易に出来るように、十分な解説を含むべきです。
[BaseObject のクラス・ファイル](https://github.com/yiisoft/yii2/blob/master/framework/base/BaseObject.php) を参照すると、コードに解説を加える方法を学ぶことが出来ます。
[BaseObject のクラス・ファイル](https://github.com/yiisoft/yii2/blob/master/framework/base/BaseObject.php) を参照すると、
コードに解説を加える方法を学ぶことが出来ます。
> Info: コードのコメントを Markdown 形式で書くことが出来ます。
`yiisoft/yii2-apidoc` エクステンションが、コードのコメントに基づいて綺麗な API ドキュメントを生成するツールを提供しています。
@ -371,48 +386,73 @@ Yii はテストのサポートを提供しており、それよって、単体
[コア・フレームワーク・コード・スタイル](https://github.com/yiisoft/yii2/wiki/Core-framework-code-style) を参照してください。
## コアエクステンション <span id="core-extensions"></span>
## コアエクステンション <span id="core-extensions"></span>
Yii は下記のコア・エクステンションを提供しています。これらは Yii 開発チームによって開発され保守されているものです。
Yii は下記のコア・エクステンション (または ["公式エクステンション"](https://www.yiiframework.com/extensions/official)) を提供しています。
これらは Yii 開発チームによって開発され保守されているものです。
全て [Packagist](https://packagist.org/) に登録され、[エクステンションを使う](#using-extensions) の項で説明したように、簡単にインストールすることが出来ます。
- [yiisoft/yii2-apidoc](https://github.com/yiisoft/yii2-apidoc):
拡張可能で高性能な API ドキュメント生成機能を提供します。コア・フレームワークの API ドキュメントを生成するためにも使われています。
拡張可能で高性能な API ドキュメント生成機能を提供します。
コア・フレームワークの API ドキュメントを生成するためにも使われています。
- [yiisoft/yii2-authclient](https://github.com/yiisoft/yii2-authclient):
Facebook OAuth2 クライアント、GitHub OAuth2 クライアントなど、よく使われる一連の auth クライアントを提供します。
- [yiisoft/yii2-bootstrap](https://github.com/yiisoft/yii2-bootstrap):
[Bootstrap](http://getbootstrap.com/) のコンポーネントとプラグインをカプセル化した一連のウィジェットを提供します。
- [yiisoft/yii2-codeception](https://github.com/yiisoft/yii2-codeception):
- [yiisoft/yii2-codeception](https://github.com/yiisoft/yii2-codeception) (非推奨):
[Codeception](http://codeception.com/) に基づくテストのサポートを提供します。
- [yiisoft/yii2-debug](https://github.com/yiisoft/yii2-debug):
Yii アプリケーションのデバッグのサポートを提供します。
このエクステンションが使われると、全てのページの末尾にデバッガ・ツールバーが表示されます。
このエクステンションが使われると、全てのページの末尾にデバッガ・ツールバーが表示されます。
このエクステンションは、より詳細なデバッグ情報を表示する一連のスタンドアロン・ページも提供します。
- [yiisoft/yii2-elasticsearch](https://github.com/yiisoft/yii2-elasticsearch):
[Elasticsearch](http://www.elasticsearch.org/) の使用に対するサポートを提供します。
基本的なクエリ/サーチのサポートを含むだけでなく、Elasticsearch にアクティブレコードを保存することを可能にする [アクティブレコード](db-active-record.md) パターンをも実装しています。
基本的なクエリ/サーチのサポートを含むだけでなく、Elasticsearch にアクティブ・レコードを保存することを可能にする
[アクティブ・レコード](db-active-record.md) パターンをも実装しています。
- [yiisoft/yii2-faker](https://github.com/yiisoft/yii2-faker):
ダミー・データを作る [Faker](https://github.com/fzaninotto/Faker) を使うためのサポートを提供します。
- [yiisoft/yii2-gii](https://github.com/yiisoft/yii2-gii):
拡張性が非常に高いウェブベースのコードジェネレータを提供します。これを使って、モデル、フォーム、モジュール、CRUD などを迅速に生成することが出来ます。
拡張性が非常に高いウェブ・ベースのコード・ジェネレータを提供します。
これを使って、モデル、フォーム、モジュール、CRUD などを迅速に生成することが出来ます。
- [yiisoft/yii2-httpclient](https://github.com/yiisoft/yii2-httpclient):
provides an HTTP client.
HTTP クライアントを提供します。
- [yiisoft/yii2-imagine](https://github.com/yiisoft/yii2-imagine):
[Imagine](http://imagine.readthedocs.org/) に基づいて、使われることの多い画像操作機能を提供します。
- [yiisoft/yii2-jui](https://github.com/yiisoft/yii2-jui):
[JQuery UI](http://jqueryui.com/) のインタラクションとウィジェットをカプセル化した一連のウィジェットを提供します。
- [yiisoft/yii2-mongodb](https://github.com/yiisoft/yii2-mongodb):
[MongoDB](http://www.mongodb.org/) の使用に対するサポートを提供します。
基本的なクエリ、アクティブレコード、マイグレーション、キャッシュ、コード生成などの機能を含みます。
基本的なクエリ、アクティブ・レコード、マイグレーション、キャッシュ、コード生成などの機能を含みます。
- [yiisoft/yii2-queue](https://www.yiiframework.com/extension/yiisoft/yii2-queue):
キューによるタスクの非同期実行のサポートを提供します。
データベース、Redis、RabbitMQ、AMQP、Beanstalk および Gearman によるキューをサポートしています。
- [yiisoft/yii2-redis](https://github.com/yiisoft/yii2-redis):
[redis](http://redis.io/) の使用に対するサポートを提供します。
基本的なクエリ、アクティブレコード、キャッシュなどの機能を含みます。
基本的なクエリ、アクティブ・レコード、キャッシュなどの機能を含みます。
- [yiisoft/yii2-shell](https://www.yiiframework.com/extension/yiisoft/yii2-shell):
[psysh](http://psysh.org/) に基づくイタラクティブなシェルを提供します。
- [yiisoft/yii2-smarty](https://github.com/yiisoft/yii2-smarty):
[Smarty](http://www.smarty.net/) に基づいたテンプレート・エンジンを提供します。
- [yiisoft/yii2-sphinx](https://github.com/yiisoft/yii2-sphinx):
[Sphinx](http://sphinxsearch.com) の使用に対するサポートを提供します。
基本的なクエリ、アクティブレコード、コード生成などの機能を含みます。
基本的なクエリ、アクティブレコード、コード生成などの機能を含みます。
- [yiisoft/yii2-swiftmailer](https://github.com/yiisoft/yii2-swiftmailer):
[swiftmailer](http://swiftmailer.org/) に基づいたメール送信機能を提供します。
- [yiisoft/yii2-twig](https://github.com/yiisoft/yii2-twig):
[Twig](http://twig.sensiolabs.org/) に基づいたテンプレート・あエンジンを提供します。
[Twig](http://twig.sensiolabs.org/) に基づいたテンプレート・エンジンを提供します。
下記の公式エクステンションは Yii 2.1 以上のためのものです。
これらは、Yii 2.0 ではコア・フレームワークに含まれていますので、インストールする必要はありません。.
- [yiisoft/yii2-captcha](https://www.yiiframework.com/extension/yiisoft/yii2-captcha):
CAPTCHA を提供します。
- [yiisoft/yii2-jquery](https://www.yiiframework.com/extension/yiisoft/yii2-jquery):
[jQuery](https://jquery.com/) のサポートを提供します。
- [yiisoft/yii2-maskedinput](https://www.yiiframework.com/extension/yiisoft/yii2-maskedinput):
[jQuery Input Mask plugin](http://robinherbots.github.io/Inputmask/) に基づいて、マスクト・インプットを提供します。
- [yiisoft/yii2-mssql](https://www.yiiframework.com/extension/yiisoft/yii2-mssql):
[MSSQL](https://www.microsoft.com/sql-server/) を使うためのサポートを提供します。
- [yiisoft/yii2-oracle](https://www.yiiframework.com/extension/yiisoft/yii2-oracle):
[Oracle](https://www.oracle.com/) を使うためのサポートを提供します。
- [yiisoft/yii2-rest](https://www.yiiframework.com/extension/yiisoft/yii2-rest):
REST API に対するサポートを提供します。

64
docs/guide-ja/structure-filters.md

@ -5,7 +5,8 @@
例えば、アクセス・コントロール・フィルタはアクションの前に走って、アクションが特定のエンド・ユーザだけにアクセスを許可するものであることを保証します。
また、コンテント圧縮フィルタはアクションの後に走って、レスポンスのコンテントをエンド・ユーザに送出する前に圧縮します。
一つのフィルタは、前フィルタ (アクションの *前* に適用されるフィルタのロジック) および/または 後フィルタ (アクションの *後* に適用されるロジック) から構成することが出来ます。
一つのフィルタは、前フィルタ (アクションの *前* に適用されるフィルタのロジック) および/または
後フィルタ (アクションの *後* に適用されるロジック) から構成することが出来ます。
## フィルタを使用する <span id="using-filters"></span>
@ -31,14 +32,18 @@ public function behaviors()
```
デフォルトでは、コントローラ・クラスの中で宣言されたフィルタは、そのコントローラの *全て* のアクションに適用されます。
しかし、[[yii\base\ActionFilter::only|only]] プロパティを構成することによって、フィルタがどのアクションに適用されるべきかを明示的に指定することも出来ます。
しかし、[[yii\base\ActionFilter::only|only]] プロパティを構成することによって、
フィルタがどのアクションに適用されるべきかを明示的に指定することも出来ます。
上記の例では、 `HttpCache` フィルタは、`index` と `view` のアクションに対してのみ適用されています。
また、[[yii\base\ActionFilter::except|except]] プロパティを構成して、いくつかのアクションをフィルタされないように除外することも可能です。
コントローラのほかに、[モジュール](structure-modules.md) または [アプリケーション](structure-applications.md) でもフィルタを宣言することが出来ます。
そのようにした場合、[[yii\base\ActionFilter::only|only]] と [[yii\base\ActionFilter::except|except]] のプロパティを上で説明したように構成しない限り、そのフィルタは、モジュールまたはアプリケーションに属する *全て* のコントローラ・アクションに適用されます。
コントローラのほかに、[モジュール](structure-modules.md) または [アプリケーション](structure-applications.md)
でもフィルタを宣言することが出来ます。
そのようにした場合、[[yii\base\ActionFilter::only|only]] と [[yii\base\ActionFilter::except|except]] のプロパティを上で説明したように構成しない限り、
そのフィルタは、モジュールまたはアプリケーションに属する *全て* のコントローラ・アクションに適用されます。
> Note: モジュールやアプリケーションでフィルタを宣言する場合、[[yii\base\ActionFilter::only|only]] と [[yii\base\ActionFilter::except|except]] のプロパティでは、アクション ID ではなく、[ルート](structure-controllers.md#routes) を使わなければなりません。
> Note: モジュールやアプリケーションでフィルタを宣言する場合、[[yii\base\ActionFilter::only|only]] と [[yii\base\ActionFilter::except|except]] のプロパティでは、
アクション ID ではなく、[ルート](structure-controllers.md#routes) を使わなければなりません。
なぜなら、モジュールやアプリケーションのスコープでは、アクション ID だけでは完全にアクションを指定することが出来ないからです。
一つのアクションに複数のフィルタが構成されている場合、フィルタは下記で説明されている規則に従って適用されます。
@ -47,7 +52,8 @@ public function behaviors()
- アプリケーションで宣言されたフィルタを `behaviors()` にリストされた順に適用する。
- モジュールで宣言されたフィルタを `behaviors()` にリストされた順に適用する。
- コントローラで宣言されたフィルタを `behaviors()` にリストされた順に適用する。
- フィルタのどれかがアクションをキャンセルすると、そのフィルタの後のフィルタ (前フィルタと後フィルタの両方) は適用されない。
- フィルタのどれかがアクションをキャンセルすると、
そのフィルタの後のフィルタ (前フィルタと後フィルタの両方) は適用されない。
* 前フィルタを通過したら、アクションを走らせる。
* 後フィルタ
- コントローラで宣言されたフィルタを `behaviors()` にリストされた逆順で適用する。
@ -57,7 +63,8 @@ public function behaviors()
## フィルタを作成する <span id="creating-filters"></span>
新しいアクションフィルタを作成するためには、[[yii\base\ActionFilter]] を拡張して、[[yii\base\ActionFilter::beforeAction()|beforeAction()]] および/または [[yii\base\ActionFilter::afterAction()|afterAction()]] メソッドをオーバーライドします。
新しいアクション・フィルタを作成するためには、[[yii\base\ActionFilter]] を拡張して、
[[yii\base\ActionFilter::beforeAction()|beforeAction()]] および/または [[yii\base\ActionFilter::afterAction()|afterAction()]] メソッドをオーバーライドします。
前者はアクションが走る前に実行され、後者は走った後に実行されます。
[[yii\base\ActionFilter::beforeAction()|beforeAction()]] の返り値が、アクションが実行されるべきか否かを決定します。
返り値が `false` である場合、このフィルタの後に続くフィルタはスキップされ、アクションは実行を中止されます。
@ -99,11 +106,13 @@ Yii はよく使われる一連のフィルタを提供しており、それら
### [[yii\filters\AccessControl|AccessControl]] <span id="access-control"></span>
AccessControl は、一組の [[yii\filters\AccessControl::rules|規則]] に基づいて、シンプルなアクセス・コントロールを提供するものです。
具体的に言うと、アクションが実行される前に、AccessControl はリストされた規則を調べて、現在のコンテキスト変数 (例えば、ユーザの IP アドレスや、ユーザのログイン状態など) に最初に合致するものを見つけます。
具体的に言うと、アクションが実行される前に、AccessControl はリストされた規則を調べて、
現在のコンテキスト変数 (例えば、ユーザの IP アドレスや、ユーザのログイン状態など) に最初に合致するものを見つけます。
そして、合致した規則によって、リクエストされたアクションの実行を許可するか拒否するかを決定します。
合致する規則がなかった場合は、アクセスは拒否されます。
次の例は、認証されたユーザに対しては `create``update` のアクションへのアクセスを許可し、その他のすべてのユーザにはこれら二つのアクションに対するアクセスを拒否する仕方を示すものです。
次の例は、認証されたユーザに対しては `create``update` のアクションへのアクセスを許可し、
その他のすべてのユーザにはこれら二つのアクションに対するアクセスを拒否する仕方を示すものです。
```php
use yii\filters\AccessControl;
@ -138,7 +147,8 @@ public function behaviors()
次の例は、[[yii\filters\auth\HttpBasicAuth]] の使い方を示すもので、HTTP Basic 認証に基づくアクセス・トークンを使ってユーザを認証しています。
これを動作させるためには、あなたの [[yii\web\User::identityClass|ユーザ・アイデンティティ・クラス]]
が [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]] メソッドを実装していなければならないことに注意してください。
が [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]]
メソッドを実装していなければならないことに注意してください。
```php
use yii\filters\auth\HttpBasicAuth;
@ -162,7 +172,8 @@ public function behaviors()
ContentNegotiator は、レスポンス形式のネゴシエーションとアプリケーション言語のネゴシエーションをサポートします。
このフィルタは `GET` パラメータと `Accept` HTTP ヘッダを調べることによって、レスポンス形式 および/または 言語を決定しようとします。
次の例では、ContentNegotiator はレスポンス形式として JSON と XML をサポートし、(合衆国の)英語とドイツ語を言語としてサポートするように構成されています。
次の例では、ContentNegotiator はレスポンス形式として JSON と XML をサポートし、
(合衆国の)英語とドイツ語を言語としてサポートするように構成されています。
```php
use yii\filters\ContentNegotiator;
@ -186,9 +197,11 @@ public function behaviors()
}
```
レスポンス形式と言語は [アプリケーションのライフ・サイクル](structure-applications.md#application-lifecycle) のもっと早い段階で決定される必要があることがよくあります。
レスポンス形式と言語は [アプリケーションのライフサイクル](structure-applications.md#application-lifecycle)
のもっと早い段階で決定される必要があることがよくあります。
このため、ContentNegotiator はフィルタの他に、[ブートストラップ・コンポーネント](structure-applications.md#bootstrap) としても使うことができるように設計されています。
例えば、次のように、ContentNegotiator を [アプリケーションの構成情報](structure-applications.md#application-configurations) の中で構成することが出来ます。
例えば、次のように、ContentNegotiator を [アプリケーションの構成情報](structure-applications.md#application-configurations)
の中で構成することが出来ます。
```php
use yii\filters\ContentNegotiator;
@ -211,13 +224,15 @@ use yii\web\Response;
];
```
> Info: 望ましいコンテント・タイプと言語がリクエストから決定できない場合は、[[formats]] および [[languages]] に挙げられている最初の形式と言語が使用されます。
> Info: 望ましいコンテント・タイプと言語がリクエストから決定できない場合は、
[[formats]] および [[languages]] に挙げられている最初の形式と言語が使用されます。
### [[yii\filters\HttpCache|HttpCache]] <span id="http-cache"></span>
HttpCache は `Last-Modified` および `Etag` の HTTP ヘッダを利用して、クライアント・サイドのキャッシュを実装するものです。
例えば、
```php
use yii\filters\HttpCache;
@ -309,10 +324,12 @@ public function behaviors()
クロス・オリジン・リソース共有 [CORS](https://developer.mozilla.org/ja/docs/HTTP_access_control) とは、ウェブ・ページにおいて、さまざまなリソース (例えば、フォントや JavaScript など) を、それを生成するドメイン以外のドメインからリクエストすることを可能にするメカニズムです。
特に言えば、JavaScript の AJAX 呼出しが使用することが出来る XMLHttpRequest メカニズムです。
このような「クロス・ドメイン」のリクエストは、このメカニズムに拠らなければ、同一生成元のセキュリティ・ポリシーによって、ウェブ・ブラウザから禁止されるはずのものです。
このような「クロス・ドメイン」のリクエストは、このメカニズムに拠らなければ、
同一生成元のセキュリティ・ポリシーによって、ウェブ・ブラウザから禁止されるはずのものです。
CORS は、ブラウザとサーバが交信して、クロス・ドメインのリクエストを許可するか否かを決定する方法を定義するものです。
[[yii\filters\Cors|Cors フィルタ]] は、CORS ヘッダが常に送信されることを保証するために、Authentication / Authorization のフィルタよりも前に定義されなければなりません。
[[yii\filters\Cors|Cors フィルタ]] は、CORS ヘッダが常に送信されることを保証するために、
Authentication / Authorization のフィルタよりも前に定義されなければなりません。
```php
use yii\filters\Cors;
@ -328,18 +345,15 @@ public function behaviors()
}
```
あなたの API の [[yii\rest\ActiveController]] クラスに CORS フィルタを追加したい場合は、[REST コントローラ](rest-controllers.md#cors) のセクションも参照して下さい。
あなたの API の [[yii\rest\ActiveController]] クラスに CORS フィルタを追加したい場合は、
[REST コントローラ](rest-controllers.md#cors) のセクションも参照して下さい。
Cors のフィルタリングは [[yii\filters\Cors::$cors|$cors]] プロパティを使ってチューニングすることが出来ます。
* `cors['Origin']`: 許可される生成元を定義するのに使われる配列。
`['*']` (すべて) または `['http://www.myserver.net'、'http://www.myotherserver.com']` などが設定可能。デフォルトは `['*']`
* `cors['Access-Control-Request-Method']`: 許可される HTTP 動詞の配列。
たとえば、`['GET', 'OPTIONS', 'HEAD']`。デフォルトは `['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']`
* `cors['Access-Control-Request-Headers']`: 許可されるヘッダの配列。
全てのヘッダを意味する `['*']` または特定のヘッダを示す `['X-Request-With']` が設定可能。デフォルトは `['*']`
* `cors['Access-Control-Allow-Credentials']`: 現在のリクエストをクレデンシャルを使ってすることが出来るかどうかを定義。
`true`、`false` または `null` (設定なし) が設定可能。デフォルトは `null`
* `cors['Origin']`: 許可される生成元を定義するのに使われる配列。`['*']` (すべて) または `['http://www.myserver.net'、'http://www.myotherserver.com']` などが設定可能。デフォルトは `['*']`
* `cors['Access-Control-Request-Method']`: 許可される HTTP 動詞の配列。たとえば、`['GET', 'OPTIONS', 'HEAD']`。デフォルトは `['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']`
* `cors['Access-Control-Request-Headers']`: 許可されるヘッダの配列。全てのヘッダを意味する `['*']` または特定のヘッダを示す `['X-Request-With']` が設定可能。デフォルトは `['*']`
* `cors['Access-Control-Allow-Credentials']`: 現在のリクエストをクレデンシャルを使ってすることが出来るかどうかを定義。`true`、`false` または `null` (設定なし) が設定可能。デフォルトは `null`
* `cors['Access-Control-Max-Age']`: プリフライト・リクエストの寿命を定義。デフォルトは `86400`
次の例は、生成元 `http://www.myserver.net` に対する `GET`、`HEAD` および `OPTIONS` のメソッドによる CORS を許可するものです。

107
docs/guide-ja/structure-models.md

@ -7,13 +7,14 @@
モデル・クラスは、[[yii\base\Model]] またはその子クラスを拡張することによって作成することが出来ます。
基底クラス [[yii\base\Model]] は、次のような数多くの有用な機能をサポートしています。
* [属性](#attributes): ビジネス・データを表現します。通常のオブジェクト・プロパティや配列要素のようにしてアクセスすることが出来ます。
* [属性](#attributes): ビジネス・データを表現します。通常のオブジェクト・プロパティや配列要素のようにして
アクセスすることが出来ます。
* [属性のラベル](#attribute-labels): 属性の表示ラベルを指定します。
* [一括代入](#massive-assignment): 一回のステップで複数の属性にデータを投入することをサポートしています。
* [検証規則](#validation-rules): 宣言された検証規則に基いて入力されたデータの有効性を保証します。
* [データのエクスポート](#data-exporting): カスタマイズ可能な形式でモデル・データを配列にエクスポートすることが出来ます。
`Model` クラスは、[アクティブレコード](db-active-record.md) のような、更に高度なモデルの基底クラスでもあります。
`Model` クラスは、[アクティブレコード](db-active-record.md) のような、更に高度なモデルの基底クラスでもあります。
それらの高度なモデルについての詳細は、関連するドキュメントを参照してください。
> Info: あなたのモデル・クラスの基底クラスとして [[yii\base\Model]] を使うことが要求されている訳ではありません。
@ -22,8 +23,7 @@
## 属性 <span id="attributes"></span>
モデルはビジネスデータを *属性* の形式で表現します。
全ての属性はそれぞれパブリックにアクセス可能なモデルのプロパティと同様なものです。
モデルはビジネス・データを *属性* の形式で表現します。全ての属性はそれぞれパブリックにアクセス可能なモデルのプロパティと同様なものです。
[[yii\base\Model::attributes()]] メソッドが、モデルがどのような属性を持つかを指定します。
属性に対しては、通常のオブジェクト・プロパティにアクセスするのと同じようにして、アクセスすることが出来ます。
@ -37,7 +37,8 @@ echo $model->name;
```
また、配列の要素にアクセスするようして、属性にアクセスすることも出来ます。
これは、[[yii\base\Model]] が [ArrayAccess インタフェイス](http://php.net/manual/ja/class.arrayaccess.php) と [Traversable インタフェイス](http://jp2.php.net/manual/ja/class.traversable.php) をサポートしている恩恵です。
これは、[[yii\base\Model]] が [ArrayAccess インタフェイス](http://php.net/manual/ja/class.arrayaccess.php) と
[Traversable インタフェイス](http://jp2.php.net/manual/ja/class.traversable.php) をサポートしている恩恵です。
```php
$model = new \app\models\ContactForm;
@ -77,13 +78,15 @@ class ContactForm extends Model
[[yii\base\Model::attributes()]] をオーバーライドして、属性を異なる方法で定義することが出来ます。
このメソッドはモデルが持つ属性の名前を返さなくてはなりません。
例えば、[[yii\db\ActiveRecord]] は、関連付けられたデータベース・テーブルのコラム名を属性の名前として返すことによって、属性を定義しています。
ただし、これと同時に、定義された属性に対して通常のオブジェクト・プロパティと同じようにアクセスすることが出来るように、`__get()` や `__set()` などのマジック・メソッドをオーバーライドする必要があるかもしれないことに注意してください。
ただし、これと同時に、定義された属性に対して通常のオブジェクト・プロパティと同じようにアクセスすることが出来るように、
`__get()``__set()` などのマジック・メソッドをオーバーライドする必要があるかもしれないことに注意してください。
### 属性のラベル <span id="attribute-labels"></span>
属性の値を表示したり、入力してもらったりするときに、属性と関連付けられたラベルを表示する必要があることがよくあります。
例えば、`firstName` という名前の属性を考えたとき、入力フォームやエラー・メッセージのような箇所でエンド・ユーザに表示するときは、もっとユーザ・フレンドリーな `First Name` というラベルを表示したいと思うでしょう。
例えば、`firstName` という名前の属性を考えたとき、入力フォームやエラー・メッセージのような箇所でエンド・ユーザに表示するときは、
もっとユーザ・フレンドリーな `First Name` というラベルを表示したいと思うでしょう。
[[yii\base\Model::getAttributeLabel()]] を呼ぶことによって属性のラベルを得ることが出来ます。例えば、
@ -99,7 +102,8 @@ echo $model->getAttributeLabel('name');
このメソッドは、キャメルケースの変数名を複数の単語に分割し、各単語の最初の文字を大文字にします。
例えば、`username` は `Username` となり、`firstName` は `First Name` となります。
自動的に生成されるラベルを使用したくない場合は、[[yii\base\Model::attributeLabels()]] をオーバーライドして、属性のラベルを明示的に宣言することが出来ます。例えば、
自動的に生成されるラベルを使用したくない場合は、[[yii\base\Model::attributeLabels()]] をオーバーライドして、
属性のラベルを明示的に宣言することが出来ます。例えば、
```php
namespace app\models;
@ -168,7 +172,8 @@ $model = new User(['scenario' => User::SCENARIO_LOGIN]);
```
デフォルトでは、モデルによってサポートされるシナリオは、モデルで宣言されている [検証規則](#validation-rules) によって決定されます。
しかし、次のように、[[yii\base\Model::scenarios()]] メソッドをオーバーライドして、この振る舞いをカスタマイズすることが出来ます。
しかし、次のように、[[yii\base\Model::scenarios()]] メソッドをオーバーライドして、
この振る舞いをカスタマイズすることが出来ます。
```php
namespace app\models;
@ -191,14 +196,16 @@ class User extends ActiveRecord
```
> Info: 上記の例と後続の例では、モデル・クラスは [[yii\db\ActiveRecord]] を拡張するものとなっています。
というのは、複数のシナリオを使用することは、通常は、[アクティブレコード](db-active-record.md) クラスで発生するからです。
というのは、複数のシナリオを使用することは、通常は、[アクティブレコード](db-active-record.md) クラスで発生するからです。
`seanarios()` メソッドは、キーがシナリオの名前であり、値が対応する *アクティブな属性* である配列を返します。
アクティブな属性とは、[一括代入](#massive-assignment) することが出来て、[検証](#validation-rules) の対象になる属性です。
上記の例では、`login` シナリオにおいては `username``password` の属性がアクティブであり、一方、`register` シナリオにおいては、`username` と `password` に加えて `email` もアクティブです。
上記の例では、`login` シナリオにおいては `username``password` の属性がアクティブであり、
一方、`register` シナリオにおいては、`username` と `password` に加えて `email` もアクティブです。
`scenarios()` のデフォルトの実装は、検証規則の宣言メソッドである [[yii\base\Model::rules()]] に現れる全てのシナリオを返すものです。
`scenarios()` をオーバーライドするときに、デフォルトのシナリオに加えて新しいシナリオを導入したい場合は、次のようなコードを書きます。
`scenarios()` をオーバーライドするときに、デフォルトのシナリオに加えて新しいシナリオを導入したい場合は、
次のようなコードを書きます。
```php
namespace app\models;
@ -207,6 +214,9 @@ use yii\db\ActiveRecord;
class User extends ActiveRecord
{
const SCENARIO_LOGIN = 'login';
const SCENARIO_REGISTER = 'register';
public function scenarios()
{
$scenarios = parent::scenarios();
@ -218,20 +228,22 @@ class User extends ActiveRecord
```
シナリオの機能は、主として、[検証](#validation-rules) と [属性の一括代入](#massive-assignment) によって使用されます。
しかし、他の目的に使うことも可能です。例えば、現在のシナリオに基づいて異なる [属性のラベル](#attribute-labels) を宣言することも出来ます。
しかし、他の目的に使うことも可能です。例えば、現在のシナリオに基づいて異なる [属性のラベル](#attribute-labels)
を宣言することも出来ます。
## 検証規則 <span id="validation-rules"></span>
モデルのデータをエンド・ユーザから受け取ったときは、データを検証して、それが一定の規則 (*検証規則*、あるいは、いわゆる *ビジネス・ルール*) を満たしていることを確認しなければなりません。
モデルのデータをエンド・ユーザから受け取ったときは、データを検証して、
それが一定の規則 (*検証規則*、あるいは、いわゆる *ビジネス・ルール*) を満たしていることを確認しなければなりません。
`ContactForm` モデルを例に挙げるなら、全ての属性が空ではなく、`email` 属性が有効なメール・アドレスを含んでいることを確認したいでしょう。
いずれかの属性の値が対応するビジネス・ルールを満たしていないときは、ユーザがエラーを訂正するのを助ける適切なエラー・メッセージが表示されなければなりません。
いずれかの属性の値が対応するビジネス・ルールを満たしていないときは、
ユーザがエラーを訂正するのを助ける適切なエラー・メッセージが表示されなければなりません。
受信したデータを検証するために、[[yii\base\Model::validate()]] を呼ぶことが出来ます。
このメソッドは、[[yii\base\Model::rules()]] で宣言された検証規則を使って、該当するすべての属性を検証します。
エラーが見つからなければ、メソッドは `true` を返します。
そうでなければ、[[yii\base\Model::errors]] にエラーを保存して、`false` を返します。
例えば、
そうでなければ、[[yii\base\Model::errors]] にエラーを保存して、`false` を返します。例えば、
```php
$model = new \app\models\ContactForm;
@ -248,7 +260,8 @@ if ($model->validate()) {
```
モデルに関連付けられた検証規則を宣言するためには、[[yii\base\Model::rules()]] メソッドをオーバーライドして、モデルの属性が満たすべき規則を返すようにします。
モデルに関連付けられた検証規則を宣言するためには、[[yii\base\Model::rules()]] メソッドをオーバーライドして、
モデルの属性が満たすべき規則を返すようにします。
次の例は、`ContactForm` モデルのために宣言された検証規則を示します。
```php
@ -287,14 +300,16 @@ public function rules()
`on` プロパティを指定しない場合は、その規則は全てのシナリオに適用されることになります。
現在の [[yii\base\Model::scenario|シナリオ]] に適用可能な規則は *アクティブな規則* と呼ばれます。
属性が検証されるのは、それが `scenarios()` の中でアクティブな属性であると宣言されており、かつ、その属性が `rules()` の中で宣言されている一つまたは複数のアクティブな規則と結び付けられている場合であり、また、そのような場合だけです。
属性が検証されるのは、それが `scenarios()` の中でアクティブな属性であると宣言されており、かつ、
その属性が `rules()` の中で宣言されている一つまたは複数のアクティブな規則と結び付けられている場合であり、また、そのような場合だけです。
## 一括代入 <span id="massive-assignment"></span>
一括代入は、一行のコードを書くだけで、ユーザの入力した複数のデータをモデルに投入できる便利な方法です。
一括代入は、入力されたデータを [[yii\base\Model::$attributes]] プロパティに直接に代入することによって、モデルの属性にデータを投入します。
次の二つのコード断片は等価であり、どちらもエンド・ユーザから送信されたフォームのデータを `ContactForm` モデルの属性に割り当てようとするものです。
次の二つのコード断片は等価であり、どちらもエンド・ユーザから送信されたフォームのデータを
`ContactForm` モデルの属性に割り当てようとするものです。
明らかに、一括代入を使う前者の方が、後者よりも明快で間違いも起こりにくいでしょう。
```php
@ -314,8 +329,10 @@ $model->body = isset($data['body']) ? $data['body'] : null;
### 安全な属性 <span id="safe-attributes"></span>
一括代入は、いわゆる *安全な属性*、すなわち、[[yii\base\Model::scenarios()]] においてモデルの現在の [[yii\base\Model::scenario|シナリオ]] のためにリストされている属性に対してのみ適用されます。
例えば、`User` モデルが次のようなシナリオ宣言を持っている場合において、現在のシナリオが `login` であるときは、`username` と `password` のみが一括代入が可能です。
一括代入は、いわゆる *安全な属性*、すなわち、[[yii\base\Model::scenarios()]] においてモデルの現在の
[[yii\base\Model::scenario|シナリオ]] のためにリストされている属性に対してのみ適用されます。
例えば、`User` モデルが次のようなシナリオ宣言を持っている場合において、現在のシナリオが `login` であるときは、
`username``password` のみが一括代入が可能です。
その他の属性はいっさい触れられません。
```php
@ -328,13 +345,17 @@ public function scenarios()
}
```
> Info: 一括代入が安全な属性に対してのみ適用されるのは、エンド・ユーザの入力データがどの属性を修正することが出来るか、ということを制御する必要があるからです。
例えば、`User` モデルに、ユーザに割り当てられた権限を決定する `permission` という属性がある場合、この属性が修正できるのは、管理者がバックエンドのインタフェイスを通じてする時だけに制限したいでしょう。
> Info: 一括代入が安全な属性に対してのみ適用されるのは、エンド・ユーザの入力データがどの属性を修正することが出来るか、
ということを制御する必要があるからです。
例えば、`User` モデルに、ユーザに割り当てられた権限を決定する `permission` という属性がある場合、
この属性を修正できるのは、管理者がバックエンドのインタフェイスを通じてする時だけに制限したいでしょう。
[[yii\base\Model::scenarios()]] のデフォルトの実装は [[yii\base\Model::rules()]] に現われる全てのシナリオと属性を返すものです。
従って、このメソッドをオーバーライドしない場合は、アクティブな検証規則のどれかに出現する限り、その属性は安全である、ということになります。
従って、このメソッドをオーバーライドしない場合は、アクティブな検証規則のどれかに出現する限り、
その属性は安全である、ということになります。
このため、実際に検証することなく属性を安全であると宣言できるように、`safe` というエイリアスを与えられた特別なバリデータが提供されています。
このため、実際に検証することなく属性を安全であると宣言できるように、
`safe` というエイリアスを与えられた特別なバリデータが提供されています。
例えば、次の規則は `title``description` の両方が安全な属性であると宣言しています。
```php
@ -387,15 +408,14 @@ public function rules()
## データのエクスポート <span id="data-exporting"></span>
モデルを他の形式にエクスポートする必要が生じることはよくあります。
例えば、モデルのコレクションを JSON や Excel 形式に変換したい場合があるでしょう。
モデルを他の形式にエクスポートする必要が生じることはよくあります。例えば、モデルのコレクションを JSON や Excel 形式に変換したい場合があるでしょう。
このエクスポートのプロセスは二つの独立したステップに分割することが出来ます。
- モデルが配列に変換され、
- 配列が目的の形式に変換される。
あなたは最初のステップだけに注力することが出来ます。
と言うのは、第二のステップは汎用的なデータフォーマッタ、例えば [[yii\web\JsonResponseFormatter]] によって達成できるからです。
と言うのは、第二のステップは汎用的なデータフォーマッタ、例えば [[yii\web\JsonResponseFormatter]] によって達成できるからです。
モデルを配列に変換する最も簡単な方法は、[[yii\base\Model::$attributes]] プロパティを使うことです。
例えば、
@ -405,24 +425,28 @@ $post = \app\models\Post::findOne(100);
$array = $post->attributes;
```
デフォルトでは、[[yii\base\Model::$attributes]] プロパティは [[yii\base\Model::attributes()]] で宣言されている *全て* の属性の値を返します。
デフォルトでは、[[yii\base\Model::$attributes]] プロパティは [[yii\base\Model::attributes()]]
で宣言されている *全て* の属性の値を返します。
モデルを配列に変換するためのもっと柔軟で強力な方法は、[[yii\base\Model::toArray()]] メソッドを使うことです。
このメソッドのデフォルトの動作は [[yii\base\Model::$attributes]] のそれと同じものです。
しかしながら、このメソッドを使うと、どのデータ項目 (*フィールド* と呼ばれます) を結果の配列に入れるか、そして、その項目にどのような書式を適用するかを選ぶことが出来ます。
実際、[レスポンス形式の設定](rest-response-formatting.md) で説明されているように、RESTful ウェブサービスの開発においては、これがモデルをエクスポートするデフォルトの方法となっています。
実際、[レスポンス形式の設定](rest-response-formatting.md) で説明されているように、RESTful ウェブサービスの開発においては、
これがモデルをエクスポートするデフォルトの方法となっています。
### フィールド <span id="fields"></span>
フィールドとは、単に、モデルの [[yii\base\Model::toArray()]] メソッドを呼ぶことによって取得される配列に含まれる、名前付きの要素のことです。
フィールドとは、単に、モデルの [[yii\base\Model::toArray()]] メソッドを呼ぶことによって取得される配列に含まれる、
名前付きの要素のことです。
デフォルトでは、フィールドの名前は属性の名前と等しいものになります。
しかし、このデフォルトの動作は、[[yii\base\Model::fields()|fields()]] および/または [[yii\base\Model::extraFields()|extraFields()]] メソッドをオーバーライドして、変更することが出来ます。
どちらのメソッドも、フィールド定義のリストを返します。
どちらのメソッドも、フィールド定義のリストを返すものです。
`fields()` によって定義されるフィールドは、デフォルト・フィールドです。すなわち、`toArray()` はデフォルトでこれらのフィールドを返す、ということを意味します。
`extraFields()` メソッドは、`$expand` パラメータによって指定する限りにおいて `toArray()` によって返される、追加のフィールドを定義するものです。
例として、次のコードは、`fields()` で定義された全てのフィールドと、(`extraFields()` で定義されていれば) `prettyName``fullAddress` フィールドを返すものです。
例として、次のコードは、`fields()` で定義された全てのフィールドと、(`extraFields()` で定義されていれば)
`prettyName``fullAddress` フィールドを返すものです。
```php
$array = $model->toArray([], ['prettyName', 'fullAddress']);
@ -466,7 +490,8 @@ public function fields()
}
```
> Warning: デフォルトではモデルの全ての属性がエクスポートされる配列に含まれるため、データを精査して、公開すべきでない情報が含まれていないことを確認しなければなりません。
> Warning: デフォルトではモデルの全ての属性がエクスポートされる配列に含まれるため、データを精査して、
> 公開すべきでない情報が含まれていないことを確認しなければなりません。
> そういう情報がある場合は、`fields()` をオーバーライドして、除外しなければなりません。
> 上記の例では、`auth_key`、`password_hash` および `password_reset_token` を除外しています。
@ -488,17 +513,21 @@ public function fields()
* あまりに多くの [シナリオ](#scenarios) を一つのモデルで持つことは避けましょう。
大規模で複雑なシステムを開発するときには、たいてい、上記の最後にあげた推奨事項を考慮するのが良いでしょう。
そういうシステムでは、モデルは数多くの場所で使用され、それに従って、数多くの規則セットやビジネス・ロジックを含むため、非常に太ったものになり得ます。
そういうシステムでは、モデルは数多くの場所で使用され、それに従って、数多くの規則セットやビジネス・ロジックを含むため、
非常に太ったものになり得ます。
コードの一ヶ所に触れるだけで数ヶ所の違った場所に影響が及ぶため、ついには、モデルのコードの保守が悪夢になってしまうこともよくあります。
モデルのコードの保守性を高めるためには、以下の戦略をとることが出来ます。
* 異なる [アプリケーション](structure-applications.md) または [モジュール](structure-modules.md) によって共有される一連の基底モデル・クラスを定義します。
* 異なる [アプリケーション](structure-applications.md) または [モジュール](structure-modules.md)
によって共有される一連の基底モデル・クラスを定義します。
これらのモデル・クラスは、すべてで共通に使用される最小限の規則セットとロジックのみを含むべきです。
* モデルを使用するそれぞれの [アプリケーション](structure-applications.md) または [モジュール](structure-modules.md) において、対応する基底モデル・クラスから拡張した具体的なモデル・クラスを定義します。
* モデルを使用するそれぞれの [アプリケーション](structure-applications.md) または [モジュール](structure-modules.md) において、
対応する基底モデル・クラスから拡張した具体的なモデル・クラスを定義します。
この具体的なモデル・クラスが、そのアプリケーションやモジュールに固有の規則やロジックを含むべきです。
例えば、[アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) の中で、基底モデル・クラス `common\models\Post` を定義することが出来ます。
次に、フロントエンド・アプリケーションにおいては、`common\models\Post` から拡張した具体的なモデル・クラス `frontend\models\Post` を定義して使います。
次に、フロントエンド・アプリケーションにおいては、`common\models\Post` から拡張した具体的なモデル・クラス
`frontend\models\Post` を定義して使います。
また、バックエンド・アプリケーションにおいても、同様に、`backend\models\Post` を定義します。
この戦略を取ると、`frontend\models\Post` の中のコードはフロントエンド・アプリケーション固有のものであると保証することが出来ます。
そして、フロントエンドのコードにどのような変更を加えても、バックエンド・アプリケーションを壊すかもしれないと心配する必要がなくなります。

89
docs/guide-ja/structure-modules.md

@ -4,7 +4,8 @@
モジュールは、[モデル](structure-models.md)、[ビュー](structure-views.md)、[コントローラ](structure-controllers.md)、およびその他の支援コンポーネントから構成される自己充足的なソフトウェアのユニットです。
モジュールが [アプリケーション](structure-applications.md) にインストールされている場合、エンド・ユーザはモジュールのコントローラにアクセスする事が出来ます。
これらのことを理由として、モジュールは小さなアプリケーションと見なされることがよくあります。
しかし、モジュールは単独では配備できず、アプリケーションの中に存在しなければならないという点で [アプリケーション](structure-applications.md) とは異なります。
しかし、モジュールは単独では配備できず、アプリケーションの中に存在しなければならないという点で
[アプリケーション](structure-applications.md) とは異なります。
## モジュールを作成する <span id="creating-modules"></span>
@ -31,7 +32,8 @@ forum/
全てのモジュールは [[yii\base\Module]] から拡張したユニークなモジュール・クラスを持たなければなりません。
モジュール・クラスは、モジュールの [[yii\base\Module::basePath|ベース・パス]] 直下に配置されて [オートロード可能](concept-autoloading.md) になっていなければなりません。
モジュールがアクセスされたとき、対応するモジュール・クラスの単一のインスタンスが作成されます。
[アプリケーションのインスタンス](structure-applications.md) と同じように、モジュールのインスタンスは、モジュール内のコードがデータとコンポーネントを共有するために使用されます。
[アプリケーションのインスタンス](structure-applications.md) と同じように、モジュールのインスタンスは、
モジュール内のコードがデータとコンポーネントを共有するために使用されます。
次のコードは、モジュール・クラスがどのようなものかを示す例です。
@ -50,7 +52,8 @@ class Module extends \yii\base\Module
}
```
`init` メソッドがモジュールのプロパティを初期化するためのコードをたくさん含む場合は、それを [構成情報](concept-configurations.md) の形で保存し、`init()` の中で次のコードを使って読み出すことも可能です。
`init` メソッドがモジュールのプロパティを初期化するためのコードをたくさん含む場合は、
それを [構成情報](concept-configurations.md) の形で保存し、`init()` の中で次のコードを使って読み出すことも可能です。
```php
public function init()
@ -61,7 +64,8 @@ public function init()
}
```
ここで、構成情報ファイル `config.php` は、[アプリケーションの構成情報](structure-applications.md#application-configurations) の場合と同じように、次のような内容を含むことが出来ます。
ここで、構成情報ファイル `config.php` は、[アプリケーションの構成情報](structure-applications.md#application-configurations) の場合と同じように、
次のような内容を含むことが出来ます。
```php
<?php
@ -78,9 +82,11 @@ return [
### モジュール内のコントローラ <span id="controllers-in-modules"></span>
モジュールの中でコントローラを作成するときは、コントローラ・クラスをモジュール・クラスの名前空間の `controllers` サブ名前空間に置くことが規約です。
このことは、同時に、コントローラのクラス・ファイルをモジュールの [[yii\base\Module::basePath|ベースパス]] 内の `controllers` ディレクトリに置くべきことをも意味します。
例えば、前の項で示された `forum` モジュールの中で `post` コントローラを作成するためには、次のようにしてコントローラを宣言しなければなりません。
モジュールの中でコントローラを作成するときは、コントローラ・クラスをモジュール・クラスの名前空間の
`controllers` サブ名前空間に置くことが規約です。
このことは、同時に、コントローラのクラス・ファイルをモジュールの [[yii\base\Module::basePath|ベース・パス]] 内の `controllers` ディレクトリに置くべきことをも意味します。
例えば、前の項で示された `forum` モジュールの中で `post` コントローラを作成するためには、
次のようにしてコントローラを宣言しなければなりません。
```php
namespace app\modules\forum\controllers;
@ -100,21 +106,23 @@ class PostController extends Controller
### モジュール内のビュー <span id="views-in-modules"></span>
モジュール内のビューは、モジュールの [[yii\base\Module::basePath|ベースパス]] 内の `views` ディレクトリに置かれなくてはなりません。
モジュール内のビューは、モジュールの [[yii\base\Module::basePath|ベースパス]] 内の `views` ディレクトリに置かれなくてはなりません。
モジュール内のコントローラによってレンダリングされるビューは、ディレクトリ `views/ControllerID` の下に置きます。
ここで、`ControllerID` は [コントローラ ID](structure-controllers.md#routes) を指します。
例えば、コントローラ・クラスが `PostController` である場合、ディレクトリはモジュールの [[yii\base\Module::basePath|ベースパス]] の中の `views/post` となります。
例えば、コントローラ・クラスが `PostController` である場合、ディレクトリはモジュールの [[yii\base\Module::basePath|ベース・パス]]
の中の `views/post` となります。
モジュールは、そのモジュールのコントローラによってレンダリングされるビューに適用される [レイアウト](structure-views.md#layouts) を指定することが出来ます。
レイアウトは、デフォルトでは `views/layouts` ディレクトリに置かれなければならず、また、[[yii\base\Module::layout]] プロパティがレイアウトの名前を指すように構成しなければなりません。
レイアウトは、デフォルトでは `views/layouts` ディレクトリに置かれなければならず、また、
[[yii\base\Module::layout]] プロパティがレイアウトの名前を指すように構成しなければなりません。
`layout` プロパティを構成しない場合は、アプリケーションのレイアウトが代りに使用されます。
### モジュール内のコンソールコマンド <span id="console-commands-in-modules"></span>
[コンソール](tutorial-console.md) モードで使用する事が出来るコマンドをmodeコマンドをモジュール内で宣言することも可能です。
[コンソール](tutorial-console.md) モードで使用する事が出来るコマンドをモジュール内で宣言することも可能です。
あなたのコマンドがコマンドラインユーティリティから見えるようにするためには、Yii がコンソール・モードで実行されたときに
あなたのコマンドがコマンドラインユーティリティから見えるようにするためには、Yii がコンソール・モードで実行されたときに
[[yii\base\Module::controllerNamespace]] を変更して、コマンドの名前空間を指し示すようにする必要があります。
それを達成する一つの方法は、モジュールの `init()` メソッドの中で Yii アプリケーションのインスタンスの型を調べるという方法です。
@ -135,11 +143,11 @@ public function init()
yii <module_id>/<command>/<sub_command>
```
## モジュールを使う <span id="using-modules"></span>
アプリケーションの中でモジュールを使うためには、アプリケーションの [[yii\base\Application::modules|modules]] プロパティのリストにそのモジュールを載せてアプリケーションを構成するだけで大丈夫です。
次のコードは、[アプリケーションの構成情報](structure-applications.md#application-configurations) の中で `forum` モジュールを使うようにするものです。
アプリケーションの中でモジュールを使うためには、アプリケーションの [[yii\base\Application::modules|modules]]
プロパティのリストにそのモジュールを載せてアプリケーションを構成するだけで大丈夫です。
[アプリケーションの構成情報](structure-applications.md#application-configurations) の中の次のコードは、`forum` モジュールを使うようにするものです。
```php
[
@ -159,15 +167,17 @@ yii <module_id>/<command>/<sub_command>
### ルート <span id="routes"></span>
アプリケーションの中のコントローラをアクセスするのと同じように、[ルート](structure-controllers.md#routes) がモジュールの中のコントローラを指し示すために使われます。
モジュール内のコントローラのルートは、モジュール ID で始まり、[コントローラ ID](structure-controllers.md#controller-ids)、[アクション ID](structure-controllers.md#action-ids) と続くものでなければなりません。
例えば、アプリケーションが `forum` という名前のモジュールを使用している場合、`forum/post/index` というルートは、`forum` モジュール内の `post` コントローラの `index` アクションを表します。
ルートがモジュール ID だけを含む場合は、[[yii\base\Module::defaultRoute]] プロパティ (デフォルト値は `default` です) が、どのコントローラ/アクションが使用されるべきかを決定します。
アプリケーションの中のコントローラをアクセスするのと同じように、[ルート](structure-controllers.md#routes)
がモジュールの中のコントローラを指し示すために使われます。
モジュール内のコントローラのルートは、モジュール ID で始まり、[コントローラ ID](structure-controllers.md#controller-ids)、
[アクション ID](structure-controllers.md#action-ids) と続くものでなければなりません。
例えば、アプリケーションが `forum` という名前のモジュールを使用している場合、`forum/post/index` というルートは、
`forum` モジュール内の `post` コントローラの `index` アクションを表します。
ルートがモジュール ID だけを含む場合は、[[yii\base\Module::defaultRoute]] プロパティ (デフォルト値は `default` です) が、どのコントローラ・アクションが使用されるべきかを決定します。
これは、`forum` というルートは `forum` モジュール内の `default` コントローラを表すという意味です。
モジュールのための URL マネージャの規則は [[yii\web\UrlManager::parseRequest()]] が起動される前に追加されなくてはなりません。
すなわち、モジュールの `init()` の中で規則を追加しても動作しない、ということです。
なぜなら、モジュールの初期化はルートの処理が済んだ後になるからです。
すなわち、モジュールの `init()` の中で規則を追加しても動作しない、ということです。なぜなら、モジュールの初期化はルートの処理が済んだ後になるからです。
従って、RUL 規則は [ブートストラップ段階](structure-extensions.md#bootstrapping-classes) で追加される必要があります。
また、モジュールの URL 規則を [[\yii\web\GroupUrlRule]] に入れるのも良い方法です。
@ -186,13 +196,13 @@ $module = MyModuleClass::getInstance();
ここで `MyModuleClass` は、当該モジュール・クラスの名前を指すものです。
`getInstance()` メソッドは、現在リクエストされているモジュール・クラスのインスタンスを返します。
モジュールがリクエストされていない場合は、このメソッドは `null` を返します。
モジュール・クラスの新しいインスタンスを手動で作成しようとしてはいけないことに注意してください。
モジュールがリクエストされていない場合は、このメソッドは `null` を返します。モジュール・クラスの新しいインスタンスを手動で作成しようとしてはいけないことに注意してください。
手動で作成したインスタンスは、リクエストに対するレスポンスとして Yii によって作成されたインスタンスとは別のものになります。
> Info: モジュールを開発するとき、モジュールが固定の ID を使うと仮定してはいけません。
なぜなら、モジュールは、アプリケーションや他のモジュールの中で使うときに、任意の ID と結び付けることが出来るからです。
モジュール ID を取得するためには、上記の方法を使って最初にモジュールのインスタンスを取得し、そして `$module->id` によって ID を取得しなければなりません。
モジュール ID を取得するためには、上記の方法を使って最初にモジュールのインスタンスを取得し、
そして `$module->id` によって ID を取得しなければなりません。
モジュールのインスタンスにアクセスするためには、次の二つの方法を使うことも出来ます。
@ -204,10 +214,10 @@ $module = \Yii::$app->getModule('forum');
$module = \Yii::$app->controller->module;
```
最初の方法は、モジュール ID を知っている時しか役に立ちません。一方、第二の方法は、リクエストされているコントローラについて知っている場合に使うのに最適な方法です。
最初の方法は、モジュール ID を知っている時しか役に立ちません。一方、第二の方法は、
リクエストされているコントローラについて知っている場合に使うのに最適な方法です。
いったんモジュールのインスタンスをとらえれば、モジュールに登録されたパラメータやコンポーネントにアクセスすることが可能になります。
例えば、
いったんモジュールのインスタンスをとらえれば、モジュールに登録されたパラメータやコンポーネントにアクセスすることが可能になります。例えば、
```php
$maxPostCount = $module->params['maxPostCount'];
@ -216,7 +226,7 @@ $maxPostCount = $module->params['maxPostCount'];
### モジュールをブートストラップする <span id="bootstrapping-modules"></span>
いくつかのモジュールは、全てのリクエストで毎回走らせる必要があります。[[yii\debug\Module|デバッグ]] モジュールがその一例です。
いくつかのモジュールは、全てのリクエストで毎回走らせる必要があります。[[yii\debug\Module|デバッグ]]モジュールがその一例です。
そうするためには、そのようなモジュールをアプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストに挙げます。
例えば、次のアプリケーションの構成情報は、`debug` モジュールが常にロードされることを保証するものです。
@ -236,11 +246,9 @@ $maxPostCount = $module->params['maxPostCount'];
## 入れ子のモジュール <span id="nested-modules"></span>
モジュールはレベルの制限無く入れ子にすることが出来ます。
つまり、モジュールは別のモジュールを含むことが出来、その含まれたモジュールもさらに別のモジュールを含むことが出来ます。
モジュールはレベルの制限無く入れ子にすることが出来ます。つまり、モジュールは別のモジュールを含むことが出来、その含まれたモジュールもさらに別のモジュールを含むことが出来ます。
含む側を *親モジュール*、含まれる側を *子モジュール* と呼びます。
子モジュールは、親モジュールの [[yii\base\Module::modules|modules]] プロパティの中で宣言されなければなりません。
例えば、
子モジュールは、親モジュールの [[yii\base\Module::modules|modules]] プロパティの中で宣言されなければなりません。例えば、
```php
namespace app\modules\forum;
@ -262,7 +270,8 @@ class Module extends \yii\base\Module
```
入れ子にされたモジュールの中にあるコントローラのルートは、全ての祖先のモジュールの ID を含まなければなりません。
例えば、`forum/admin/dashboard/index` というルートは、`forum` モジュールの子モジュールである `admin` モジュールの `dashboard` コントローラの `index` アクションを表します。
例えば、`forum/admin/dashboard/index` というルートは、`forum` モジュールの子モジュールである `admin` モジュールの
`dashboard` コントローラの `index` アクションを表します。
> Info: [[yii\base\Module::getModule()|getModule()]] メソッドは、親モジュールに直接属する子モジュールだけを返します。
[[yii\base\Application::loadedModules]] プロパティがロードされた全てのモジュールのリストを保持しています。
@ -271,7 +280,8 @@ class Module extends \yii\base\Module
## モジュール内からコンポーネントにアクセスする
バージョン 2.0.13 以降、モジュールは [ツリー走査](concept-service-locator.md#tree-traversal) をサポートしています。
これによって、モジュールの開発者は(アプリケーション)コンポーネントを参照するのに、サービス・ロケータとして自身のモジュールを使うことが出来るようになりました。
これによって、モジュールの開発者は(アプリケーション)コンポーネントを参照するのに、
サービス・ロケータとして自身のモジュールを使うことが出来るようになりました。
これが意味することは、`Yii::$app->get('db')` よりも `$module->get('db')` を使う方が良い、ということです。
モジュールのユーザは、異なるコンポーネント(構成)が要求される場合は、モジュールで使用する特定のコンポーネントを指定することが出来ます。
@ -297,14 +307,15 @@ class Module extends \yii\base\Module
],
```
アプリケーションのデータベース・テーブルは `main_` という接頭辞を持つ一方で、
モジュールのデータベース・テーブルは `module_` という接頭辞を持ちます。
上記の構成はマージされないということに注意して下さい。例えば、モジュールのコンポーネントではクエリキャッシュはデフォルト値に従って有効なままになります。
アプリケーションのデータベース・テーブルは `main_` という接頭辞を持つ一方で、モジュールのデータベース・テーブルは `module_` という接頭辞を持ちます。
上記の構成はマージされないということに注意して下さい。例えば、モジュールのコンポーネントではクエリ・キャッシュはデフォルト値に従って有効なままになります。
## ベスト・プラクティス <span id="best-practices"></span>
モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、規模の大きなアプリケーションに最も適しています。
モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、
規模の大きなアプリケーションに最も適しています。
そのような機能グループをそれぞれモジュールとして、特定の個人やチームによって開発することが出来ます。
モジュールは、また、機能グループ・レベルでコードを再利用するための良い方法でもあります。
ある種のよく使われる機能、例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、モジュールの形式で開発することが出来ます。
ある種のよく使われる機能、例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、
モジュールの形式で開発することが出来ます。

12
docs/guide-ja/structure-overview.md

@ -10,12 +10,16 @@ MVC 以外にも、Yii のアプリケーションは下記の要素を持って
* [エントリ・スクリプト](structure-entry-scripts.md): エンド・ユーザから直接アクセスできる PHP スクリプトです。
これはリクエスト処理サイクルを開始する役目を持っています。
* [アプリケーション](structure-applications.md): グローバルにアクセス可能なオブジェクトであり、アプリケーション・コンポーネントを管理し、連携させて、リクエストに応えます。
* [アプリケーション・コンポーネント](structure-application-components.md): アプリケーションと共に登録されたオブジェクトであり、リクエストに応えるための様々なサービスを提供します。
* [アプリケーション](structure-applications.md): グローバルにアクセス可能なオブジェクトであり、
アプリケーション・コンポーネントを管理し、連携させて、リクエストに応えます。
* [アプリケーション・コンポーネント](structure-application-components.md): アプリケーションと共に登録されたオブジェクトであり、
リクエストに応えるための様々なサービスを提供します。
* [モジュール](structure-modules.md): それ自身に完全な MVC を含む自己完結的なパッケージです。
アプリケーションは複数のモジュールとして編成することが出来ます。
* [フィルタ](structure-filters.md): 各リクエストが実際に処理される前と後に、コントローラから呼び出される必要があるコードを表現します。
* [ウィジェット](structure-widgets.md): [ビュー](structure-views.md) に埋め込むことが出来るオブジェクトです。コントローラのロジックを含むことが可能で、異なるビューで再利用することが出来ます。
* [フィルタ](structure-filters.md): 各リクエストが実際に処理される前と後に、
コントローラから呼び出される必要があるコードを表現します。
* [ウィジェット](structure-widgets.md): [ビュー](structure-views.md) に埋め込むことが出来るオブジェクトです。
コントローラのロジックを含むことが可能で、異なるビューで再利用することが出来ます。
下の図がアプリケーションの静的な構造を示すものです。

162
docs/guide-ja/structure-views.md

@ -3,7 +3,8 @@
ビューは [MVC](http://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。
ビューはエンド・ユーザにデータを表示することに責任を持つコードです。
ウェブ・アプリケーションにおいては、ビューは、通常、主として HTML コードと表示目的の PHP コードを含む PHP スクリプト・ファイルである、*ビュー・テンプレート* の形式で作成されます。
ウェブ・アプリケーションにおいては、ビューは、通常、*ビュー・テンプレート* の形式、すなわち、
主として HTML コードと表示目的の PHP コードを含む PHP スクリプト・ファイルとして作成されます。
そして、ビュー・テンプレートを管理する [[yii\web\View|ビュー]] [アプリケーション・コンポーネント](structure-application-components.md) が、ビューの構築とレンダリングを助けるためによく使われるメソッドを提供します。
なお、簡潔さを重視して、ビュー・テンプレートまたはビュー・テンプレート・ファイルを単にビューと呼ぶことがよくあります。
@ -36,10 +37,12 @@ $this->title = 'ログイン';
<?php ActiveForm::end(); ?>
```
ビューの中では、このビュー・テンプレートを管理しレンダリングしている [[yii\web\View|ビュー・コンポーネント]] を参照する `$this` にアクセスすることが出来ます。
ビューの中では、このビュー・テンプレートを管理しレンダリングしている [[yii\web\View|ビュー・コンポーネント]] を参照する
`$this` にアクセスすることが出来ます。
`$this` 以外に、上記の例の `$model` のように、事前に定義される変数をビューの中に置くことが出来ます。
このような変数は、[ビューのレンダリング](#rendering-views) をトリガする [コントローラ](structure-controllers.md) などのオブジェクトによってビューに *プッシュ* されるデータを表します。
このような変数は、[ビューのレンダリング](#rendering-views) をトリガする [コントローラ](structure-controllers.md)
などのオブジェクトによってビューに *プッシュ* されるデータを表します。
> Tip: 上の例では、事前に定義される変数は、IDE に認識されるように、ビューの先頭のコメント・ブロックの中にリストされています。
これは、ビューにドキュメントを付けるのにも良い方法です。
@ -48,9 +51,10 @@ $this->title = 'ログイン';
### セキュリティ <span id="security"></span>
HTML ページを生成するビューを作成するときは、エンド・ユーザから受け取るデータを表示する前にエンコード および/または フィルタすることが重要です。
そうしなければ、あなたのアプリケーションは [クロス・サイト・スクリプティング](http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) 攻撃をこうむるおそれがあります。
そうしなければ、あなたのアプリケーションは [クロス・サイト・スクリプティング](http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) 攻撃を
こうむるおそれがあります。
平文テキストを表示するためには、まず [[yii\helpers\Html::encode()]] を呼んでエンコードします。
プレーン・テキストを表示するためには、まず [[yii\helpers\Html::encode()]] を呼んでエンコードします。
例えば、次のコードはユーザの名前を表示する前にエンコードしています。
```php
@ -93,7 +97,8 @@ use yii\helpers\HtmlPurifier;
ここで、`WidgetPath` は、ウィジェットのクラス・ファイルを含んでいるディレクトリを指します。
* 他のオブジェクトによって表示されるビューについても、ウィジェットの場合と同じ規約に従うことが推奨されます。
これらのデフォルトのビューディレクトリは、コントローラやウィジェットの [[yii\base\ViewContextInterface::getViewPath()]] メソッドをオーバーライドすることでカスタマイズすることが可能です。
これらのデフォルトのビュー・ディレクトリは、コントローラやウィジェットの [[yii\base\ViewContextInterface::getViewPath()]]
メソッドをオーバーライドすることでカスタマイズすることが可能です。
## ビューをレンダリングする <span id="rendering-views"></span>
@ -115,12 +120,15 @@ methodName($view, $params = [])
[コントローラ](structure-controllers.md) の中では、ビューをレンダリングするために次のコントローラ・メソッドを呼ぶことが出来ます。
* [[yii\base\Controller::render()|render()]]: [名前付きビュー](#named-views) をレンダリングし、その結果に [レイアウト](#layouts) を適用する。
* [[yii\base\Controller::render()|render()]]: [名前付きビュー](#named-views) をレンダリングし、
その結果に [レイアウト](#layouts) を適用する。
* [[yii\base\Controller::renderPartial()|renderPartial()]]: [名前付きビュー](#named-views) をレイアウトなしでレンダリングする。
* [[yii\web\Controller::renderAjax()|renderAjax()]]: [名前付きビュー](#named-views) をレイアウトなしでレンダリングし、登録されている全ての JS/CSS スクリプトおよびファイルを注入する。
通常、AJAX ウェブ・リクエストに対するレスポンスにおいて使用される。
* [[yii\base\Controller::renderFile()|renderFile()]]: ビュー・ファイルのパスまたは [エイリアス](concept-aliases.md) の形式で指定されたビューをレンダリングする。
* [[yii\base\Controller::renderContent()|renderContent()]]: 静的な文字列をレンダリングして、現在適用可能な [レイアウト](#layouts) に埋め込む。このメソッドは バージョン 2.0.1 以降で使用可能。
* [[yii\base\Controller::renderFile()|renderFile()]]: ビュー・ファイルのパスまたは [エイリアス](concept-aliases.md)
の形式で指定されたビューをレンダリングする。
* [[yii\base\Controller::renderContent()|renderContent()]]: 静的な文字列をレンダリングして、現在適用可能な [レイアウト](#layouts)に埋め込む。
このメソッドは バージョン 2.0.1 以降で使用可能。
例えば、
@ -155,7 +163,8 @@ class PostController extends Controller
[ウィジェット](structure-widgets.md) の中では、ビューをレンダリングするために、次のウィジェット・メソッドを使用することが出来ます。
* [[yii\base\Widget::render()|render()]]: [名前付きビュー](#named-views) をレンダリングする。
* [[yii\base\Widget::renderFile()|renderFile()]]: ビュー・ファイルのパスまたは [エイリアス](concept-aliases.md) の形式で指定されたビューをレンダリングする。
* [[yii\base\Widget::renderFile()|renderFile()]]: ビュー・ファイルのパスまたは [エイリアス](concept-aliases.md)
の形式で指定されたビューをレンダリングする。
例えば、
@ -187,10 +196,11 @@ class ListWidget extends Widget
* [[yii\base\View::render()|render()]]: [名前付きビュー](#named-views) をレンダリングする。
* [[yii\web\View::renderAjax()|renderAjax()]]: [名前付きビュー](#named-views) をレンダリングし、登録されている全ての JS/CSS スクリプトおよびファイルを注入する。
通常、AJAX ウェブリクエストに対するレスポンスにおいて使用される。
* [[yii\base\View::renderFile()|renderFile()]]: ビュー・ファイルのパスまたは [エイリアス](concept-aliases.md) の形式で指定されたビューをレンダリングする。
* [[yii\base\View::renderFile()|renderFile()]]: ビュー・ファイルのパスまたは
[エイリアス](concept-aliases.md) の形式で指定されたビューをレンダリングする。
例えば、ビューの中の次のコードは、現在レンダリングされているビューと同じディレクトリにある `_overview.php` というビュー・ファイルをレンダリングします。
ビューでは `$this` が [[yii\base\View|ビュー]] コンポーネントを参照することを思い出してください。
ビューでは `$this` が [[yii\base\View|ビュー]]コンポーネントを参照することを思い出してください。
```php
<?= $this->render('_overview') ?>
@ -199,8 +209,8 @@ class ListWidget extends Widget
### 他の場所でのレンダリング <span id="rendering-in-other-places"></span>
場所がどこであれ、`Yii::$app->view` という式によって [[yii\base\View|ビュー]] アプリケーション・コンポーネントにアクセスすることが出来ますから、前述の [[yii\base\View|ビュー]] コンポーネント・メソッドを使ってビューをレンダリングすることが出来ます。
例えば、
場所がどこであれ、`Yii::$app->view` という式によって [[yii\base\View|ビュー]]アプリケーション・コンポーネントにアクセスすることが出来ますから、
前述の [[yii\base\View|ビュー]]・コンポーネント・メソッドを使ってビューをレンダリングすることが出来ます。例えば、
```php
// ビュー・ファイル "@app/views/site/license.php" を表示
@ -211,8 +221,7 @@ echo \Yii::$app->view->renderFile('@app/views/site/license.php');
### 名前付きビュー <span id="named-views"></span>
ビューをレンダリングするとき、ビューを指定するのには、ビューの名前か、ビュー・ファイルのパス/エイリアスか、どちらかを使うことが出来ます。
たいていの場合は、より簡潔で柔軟な前者を使います。
名前を使って指定されるビューを *名前付きビュー* と呼びます。
たいていの場合は、より簡潔で柔軟な前者を使います。名前を使って指定されるビューを *名前付きビュー* と呼びます。
ビューの名前は、以下の規則に従って、対応するビュー・ファイルのパスに解決されます。
@ -221,17 +230,22 @@ echo \Yii::$app->view->renderFile('@app/views/site/license.php');
* ビュー名が二つのスラッシュ (`//`) で始まる場合は、対応するビュー・ファイルのパスは `@app/views/ViewName` となります。
つまり、ビュー・ファイルは [[yii\base\Application::viewPath|アプリケーションのビュー・パス]] の下で探されます。
例えば、`//site/about` は `@app/views/site/about.php` へと解決されます。
* ビュー名が一つのスラッシュ (`/`) で始まる場合は、ビュー・ファイルのパスは、ビュー名の前に、現在アクティブな [モジュール](structure-modules.md) の [[yii\base\Module::viewPath|ビュー・パス]] を置くことによって形成されます。
* ビュー名が一つのスラッシュ (`/`) で始まる場合は、ビュー・ファイルのパスは、ビュー名の前に、現在アクティブな [モジュール](structure-modules.md) の
[[yii\base\Module::viewPath|ビュー・パス]] を置くことによって形成されます。
アクティブなモジュールが無い場合は、`@app/views/ViewName` が使用されます。
例えば、`/user/create` は、現在アクティブなモジュールが `user` である場合は、`@app/modules/user/views/user/create.php` へと解決されます。
アクティブなモジュールが無い場合は、ビュー・ファイルのパスは `@app/views/user/create.php` となります。
* ビューが [[yii\base\View::context|コンテキスト]] を伴ってレンダリングされ、そのコンテキストが [[yii\base\ViewContextInterface]] を実装している場合は、ビュー・ファイルのパスは、コンテキストの [[yii\base\ViewContextInterface::getViewPath()|ビューパス]] をビュー名の前に置くことによって形成されます。
* ビューが [[yii\base\View::context|コンテキスト]] を伴ってレンダリングされ、そのコンテキストが [[yii\base\ViewContextInterface]] を実装している場合は、
ビュー・ファイルのパスは、コンテキストの [[yii\base\ViewContextInterface::getViewPath()|ビュー・パス]] をビュー名の前に置くことによって形成されます。
これは、主として、コントローラとウィジェットの中でレンダリングされるビューに当てはまります。
例えば、コンテキストが `SiteController` コントローラである場合、`about` は `@app/views/site/about.php` へと解決されます。
* あるビューが別のビューの中でレンダリングされる場合は、後者のビュー・ファイルを含んでいるディレクトリが前者のビュー名の前に置かれて、実際のビュー・ファイルのパスが形成されます。
* あるビューが別のビューの中でレンダリングされる場合は、後者のビュー・ファイルを含んでいるディレクトリが前者のビュー名の前に置かれて、
実際のビュー・ファイルのパスが形成されます。
例えば、`item` は、`@app/views/post/index.php` というビューの中でレンダリングされる場合、`@app/views/post/item` へと解決されます。
上記の規則によって、コントローラ `app\controllers\PostController` の中で `$this->render('view')` を呼ぶと、実際には、ビュー・ファイル `@app/views/post/view.php` がレンダリングされ、一方、そのビューの中で `$this->render('_overview')` を呼ぶと、ビュー・ファイル `@app/views/post/_overview.php` がレンダリングされることになります。
上記の規則によって、コントローラ `app\controllers\PostController` の中で `$this->render('view')` を呼ぶと、
実際には、ビュー・ファイル `@app/views/post/view.php` がレンダリングされ、一方、そのビューの中で `$this->render('_overview')` を呼ぶと、
ビュー・ファイル `@app/views/post/_overview.php` がレンダリングされることになります。
### ビューの中でデータにアクセスする <span id="accessing-data-in-views"></span>
@ -241,7 +255,8 @@ echo \Yii::$app->view->renderFile('@app/views/site/license.php');
ビューをレンダリングするメソッドに二番目のパラメータとしてデータを渡すのが「プッシュ」のアプローチです。
データは、「名前-値」のペアの配列として表わされなければなりません。
ビューがレンダリングされるときに、PHP の `extract()` 関数がこの配列に対して呼び出され、ビューの中で使う変数が抽出されます。
例えば、次のコードはコントローラの中でビューをレンダリングしていますが、`report` ビューに二つの変数、すなわち、`$foo = 1` と `$bar = 2` をプッシュしています。
例えば、次のコードはコントローラの中でビューをレンダリングしていますが、`report` ビューに二つの変数、
すなわち、`$foo = 1` と `$bar = 2` をプッシュしています。
```php
echo $this->render('report', [
@ -259,23 +274,25 @@ echo $this->render('report', [
The controller ID is: <?= $this->context->id ?>
```
通常は「プッシュ」アプローチが、ビューでデータにアクセスする方法として推奨されます。
なぜなら、ビューのコンテキスト・オブジェクトに対する依存がより少ないからです。
通常は「プッシュ」アプローチが、ビューでデータにアクセスする方法として推奨されます。なぜなら、ビューのコンテキスト・オブジェクトに対する依存がより少ないからです。
その短所は、常にデータ配列を手作業で作成する必要がある、ということです。
ビューが共有されてさまざまな場所でレンダリングされる場合、その作業が面倒くさくなり、また、間違いも生じやすくなります。
### ビューの間でデータを共有する <span id="sharing-data-among-views"></span>
[[yii\base\View|ビュー・コンポーネント]] が提供する [[yii\base\View::params|params]] プロパティを使うと、ビューの間でデータを共有することが出来ます。
[[yii\base\View|ビュー・コンポーネント]] が提供する [[yii\base\View::params|params]] プロパティを使うと、
ビューの間でデータを共有することが出来ます。
例えば、`about` というビューで、次のようなコードを使って、パン屑リストの現在の区分を指定することが出来ます。
例えば、`about` というビューで、次のようなコードを使って、
パン屑リストの現在の区分を指定することが出来ます。
```php
$this->params['breadcrumbs'][] = 'About Us';
```
そして、[レイアウト](#layouts) ファイル (これも一つのビューです) の中で、[[yii\base\View::params|params]] によって渡されたデータを使って、パン屑リストを表示することが出来ます。
そして、[レイアウト](#layouts) ファイル (これも一つのビューです) の中で、[[yii\base\View::params|params]] によって渡されたデータを使って、
パン屑リストを表示することが出来ます。
```php
<?= yii\widgets\Breadcrumbs::widget([
@ -288,7 +305,8 @@ $this->params['breadcrumbs'][] = 'About Us';
レイアウトは、複数のビューの共通部分をあらわす特殊なタイプのビューです。
例えば、たいていのウェブ・アプリケーションでは、ページは共通のヘッダとフッタを持っています。
すべてのビューで同じヘッダとフッタを繰り返すことも出来ますが、もっと良い方法は、そういうことはレイアウトの中で一度だけして、コンテント・ビューのレンダリング結果をレイアウトの中の適切な場所に埋め込むことです。
すべてのビューで同じヘッダとフッタを繰り返すことも出来ますが、もっと良い方法は、
そういうことはレイアウトの中で一度だけして、コンテント・ビューのレンダリング結果をレイアウトの中の適切な場所に埋め込むことです。
### レイアウトを作成する <span id="creating-layouts"></span>
@ -296,7 +314,8 @@ $this->params['breadcrumbs'][] = 'About Us';
レイアウトもまたビューですので、通常のビューと同様な方法で作成することが出来ます。
デフォルトでは、レイアウトは `@app/views/layouts` ディレクトリに保存されます。
[モジュール](structure-modules.md) の中で使用されるレイアウトについては、[[yii\base\Module::basePath|モジュール・ディレクトリ]] の下の `views/layouts` ディレクトリに保存されるべきものとなります。
デフォルトのレイアウト・ディレクトリは、アプリケーションまたはモジュールの [[yii\base\Module::layoutPath]] プロパティを構成することでカスタマイズすることが出来ます。
デフォルトのレイアウト・ディレクトリは、アプリケーションまたはモジュールの
[[yii\base\Module::layoutPath]] プロパティを構成することでカスタマイズすることが出来ます。
次の例は、レイアウトがどのようなものであるかを示すものです。説明のために、レイアウトの中のコードを大幅に単純化していることに注意してください。
実際には、ヘッドのタグやメイン・メニューなど、もっと多くのコンテントを追加する必要があるでしょう。
@ -329,21 +348,26 @@ use yii\helpers\Html;
```
ご覧のように、レイアウトはすべてのページに共通な HTML タグを生成しています。
`<body>` セクションの中でレイアウトが `$content` という変数をエコーしていますが、これは、コンテント・ビューのレンダリング結果を表すものであり、[[yii\base\Controller::render()]] が呼ばれるときに、レイアウトにプッシュされるものです。
`<body>` セクションの中でレイアウトが `$content` という変数をエコーしていますが、これは、コンテント・ビューのレンダリング結果を表すものであり、
[[yii\base\Controller::render()]] が呼ばれるときに、レイアウトにプッシュされるものです。
上記のコードに示されているように、たいていのレイアウトは次に挙げるメソッドを呼び出さなければなりません。
これらのメソッドは、主としてレンダリングの過程に関するイベントをトリガするもので、他の場所で登録されたスクリプトやタグが、メソッドが呼ばれた場所に正しく注入されるようにするためのものです。
これらのメソッドは、主としてレンダリングの過程に関するイベントをトリガするもので、
他の場所で登録されたスクリプトやタグが、メソッドが呼ばれた場所に正しく注入されるようにするためのものです。
- [[yii\base\View::beginPage()|beginPage()]]: このメソッドがレイアウトの冒頭で呼ばれなければなりません。
これは、ページの開始を示す [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] イベントをトリガします。
- [[yii\base\View::endPage()|endPage()]]: このメソッドがレイアウトの末尾で呼ばれなければなりません。
これは、ページの終了を示す [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] イベントをトリガします。
- [[yii\web\View::head()|head()]]: このメソッドが HTML ページの `<head>` セクションの中で呼ばれなければなりません。
このメソッドは、ページのレンダリングが完了したときに、登録された head の HTML コード (リンク・タグ、メタ・タグなど) に置き換えられるプレースホルダを生成します。
このメソッドは、ページのレンダリングが完了したときに、登録された head の HTML コード (リンク・タグ、メタ・タグなど)
に置き換えられるプレースホルダを生成します。
- [[yii\web\View::beginBody()|beginBody()]]: このメソッドが `<body>` セクションの冒頭で呼ばれなければなりません。
このメソッドは [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] イベントをトリガし、body の開始位置をターゲットとする登録された HTML コード (JavaScript など) によって置き換えられるプレースホルダを生成します。
このメソッドは [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] イベントをトリガし、
body の開始位置をターゲットとする登録された HTML コード (JavaScript など) によって置き換えられるプレースホルダを生成します。
- [[yii\web\View::endBody()|endBody()]]: このメソッドが `<body`> セクションの末尾で呼ばれるなければなりません。
このメソッドは [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] イベントをトリガし、body の終了位置をターゲットとする登録された HTML コード (JavaScript など) によって置き換えられるプレースホルダを生成します。
このメソッドは [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] イベントをトリガし、
body の終了位置をターゲットとする登録された HTML コード (JavaScript など) によって置き換えられるプレースホルダを生成します。
### レイアウトでデータにアクセスする <span id="accessing-data-in-layouts"></span>
@ -353,18 +377,21 @@ use yii\helpers\Html;
一方、後者は、コントローラの中で [[yii\base\Controller::render()|render()]] メソッドを呼ぶことによってレンダリングされる、コンテント・ビューのレンダリング結果を含むものです。
レイアウトの中でその他のデータにアクセスする必要があるときは、[ビューの中でデータにアクセスする](#accessing-data-in-views) の項で説明されている「プル」の方法を使う必要があります。
コンテント・ビューからレイアウトにデータを渡す必要があるときは、[ビューの間でデータを共有する](#sharing-data-among-views) の項で説明されている方法を使うことが出来ます。
コンテント・ビューからレイアウトにデータを渡す必要があるときは、[ビューの間でデータを共有する](#sharing-data-among-views)
の項で説明されている方法を使うことが出来ます。
### レイアウトを使う <span id="using-layouts"></span>
[コントローラでのレンダリング](#rendering-in-controllers) の項で説明されているように、コントローラの中で [[yii\base\Controller::render()|render()]] メソッドを呼んでビューをレンダリングすると、レンダリング結果にレイアウトが適用されます。
[コントローラでのレンダリング](#rendering-in-controllers) の項で説明されているように、
コントローラの中で [[yii\base\Controller::render()|render()]] メソッドを呼んでビューをレンダリングすると、レンダリング結果にレイアウトが適用されます。
デフォルトでは、`@app/views/layouts/main.php` というレイアウトが使用されます。
[[yii\base\Application::layout]] または [[yii\base\Controller::layout]] のどちらかを構成することによって、異なるレイアウトを使うことが出来ます。
前者は全てのコントローラによって使用されるレイアウトを決定するものですが、後者は個々のコントローラについて前者をオーバーライドするものです。
例えば、次のコードは、`post` コントローラがビューをレンダリングするときに `@app/views/layouts/post.php` をレイアウトとして使うようにするものです。
その他のコントローラは、`layout` プロパティに触れられていないと仮定すると、引き続きデフォルトの `@app/views/layouts/main.php` をレイアウトとして使います。
その他のコントローラは、`layout` プロパティに触れられていないと仮定すると、
引き続きデフォルトの `@app/views/layouts/main.php` をレイアウトとして使います。
```php
namespace app\controllers;
@ -379,14 +406,18 @@ class PostController extends Controller
}
```
モジュールに属するコントローラについては、モジュールの [[yii\base\Module::layout|layout]] プロパティを構成して、モジュール内のコントローラに特定のレイアウトを使用することも出来ます。
モジュールに属するコントローラについては、モジュールの [[yii\base\Module::layout|layout]] プロパティを構成して、
モジュール内のコントローラに特定のレイアウトを使用することも出来ます。
`layout` プロパティは異なるレベル (コントローラ、モジュール、アプリケーション) で構成されうるものですので、Yii は舞台裏で二つのステップを踏んで、特定のコントローラで実際に使われるレイアウト・ファイルが何であるかを決定します。
`layout` プロパティは異なるレベル (コントローラ、モジュール、アプリケーション) で構成されうるものですので、
Yii は舞台裏で二つのステップを踏んで、特定のコントローラで実際に使われるレイアウト・ファイルが何であるかを決定します。
最初のステップで、Yii はレイアウトの値とコンテキストモジュールを決定します。
最初のステップで、Yii はレイアウトの値とコンテキストモジュールを決定します。
- コントローラの [[yii\base\Controller::layout]] プロパティが `null` でないときは、それをレイアウトの値として使い、コントローラの [[yii\base\Controller::module|モジュール]] をコンテキスト・モジュールとして使う。
- [[yii\base\Controller::layout|layout]] が `null` のときは、コントローラの祖先となっている全てのモジュール (アプリケーション自体も含む) を探して、[[yii\base\Module::layout|layout]] プロパティが `null` でない最初のモジュールを見つける。
- コントローラの [[yii\base\Controller::layout]] プロパティが `null` でないときは、それをレイアウトの値として使い、
コントローラの [[yii\base\Controller::module|モジュール]] をコンテキスト・モジュールとして使う。
- [[yii\base\Controller::layout|layout]] が `null` のときは、コントローラの祖先となっている全てのモジュール (アプリケーション自体も含む) を探して、
[[yii\base\Module::layout|layout]] プロパティが `null` でない最初のモジュールを見つける。
見つかったモジュールとその [[yii\base\Module::layout|layout]] の値をコンテキスト・モジュールと選ばれたレイアウトの値とする。
そのようなモジュールが見つからなかったときは、レイアウトは適用されないということを意味する。
@ -395,8 +426,11 @@ class PostController extends Controller
- パス・エイリアス (例えば、`@app/views/layouts/main`)。
- 絶対パス (例えば、`/main`): すなわち、スラッシュで始まるレイアウトの値の場合。
実際のレイアウトファイルはアプリケーションの [[yii\base\Application::layoutPath|レイアウト・パス]] (デフォルトでは `@app/views/layouts`) の下で探される。
- 相対パス (例えば、`main`): 実際のレイアウト・ファイルはコンテキスト・モジュールの [[yii\base\Module::layoutPath|レイアウト・パス]] (デフォルトでは [[yii\base\Module::basePath|モジュール・ディレクトリ]] の下の `views/layouts` ディレクトリ) の下で探される。
実際のレイアウトファイルはアプリケーションの [[yii\base\Application::layoutPath|レイアウト・パス]]
(デフォルトでは `@app/views/layouts`) の下で探される。
- 相対パス (例えば、`main`): 実際のレイアウト・ファイルはコンテキスト・モジュールの [[yii\base\Module::layoutPath|レイアウト・パス]]
(デフォルトでは [[yii\base\Module::basePath|モジュール・ディレクトリ]] の下の `views/layouts` ディレクトリ)
の下で探される。
- 真偽値 `false`: レイアウトは適用されない。
レイアウトの値がファイル拡張子を含んでいない場合は、デフォルト値である `.php` を使います。
@ -405,7 +439,8 @@ class PostController extends Controller
### 入れ子のレイアウト <span id="nested-layouts"></span>
ときとして、あるレイアウトの中に別のレイアウトを入れたい場合があるでしょう。
例えば、ウェブ・サイトの別々のセクションにおいて、違うレイアウトを使いたいけれども、それらのレイアウトは全て、全体としての HTML5 ページ構造を生成する同一の基本レイアウトを共有している、という場合です。
例えば、ウェブ・サイトの別々のセクションにおいて、違うレイアウトを使いたいけれども、
それらのレイアウトは全て、全体としての HTML5 ページ構造を生成する同一の基本レイアウトを共有している、という場合です。
この目的を達することは、次のように、子レイアウトの中で [[yii\base\View::beginContent()|beginContent()]] と [[yii\base\View::endContent()|endContent()]] を呼ぶことで可能になります。
```php
@ -425,8 +460,7 @@ class PostController extends Controller
### ブロックを使う <span id="using-blocks"></span>
ブロックを使うと、ある場所でビューコンテントを定義して、別の場所でそれを表示することが可能になります。
ブロックはたいていはレイアウトと一緒に使われます。
ブロックを使うと、ある場所でビューコンテントを定義して、別の場所でそれを表示することが可能になります。ブロックはたいていはレイアウトと一緒に使われます。
例えば、ブロックをコンテント・ビューで定義して、それをレイアウトで表示する、ということが出来ます。
[[yii\base\View::beginBlock()|beginBlock()]] と [[yii\base\View::endBlock()|endBlock()]] を呼んでブロックを定義します。
@ -455,7 +489,8 @@ class PostController extends Controller
<?php $this->endBlock(); ?>
```
次に、レイアウト・ビューで、得ることが出来ればブロックをレンダリングし、ブロックが定義されていないときは何らかのデフォルトのコンテントを表示します。
次に、レイアウト・ビューで、得ることが出来ればブロックをレンダリングし、
ブロックが定義されていないときは何らかのデフォルトのコンテントを表示します。
```php
...
@ -487,7 +522,8 @@ class PostController extends Controller
## ビュー・コンポーネントを使う <span id="using-view-components"></span>
[[yii\base\View|ビュー・コンポーネント]] はビューに関連する多くの機能を提供します。
ビュー・コンポーネントは、[[yii\base\View]] またはその子クラスの個別のインスタンスを作成することによっても取得できますが、たいていの場合は、`view` アプリケーション・コンポーネントを主として使うことになるでしょう。
ビュー・コンポーネントは、[[yii\base\View]] またはその子クラスの個別のインスタンスを作成することによっても取得できますが、
たいていの場合は、`view` アプリケーション・コンポーネントを主として使うことになるでしょう。
このコンポーネントは [アプリケーションの構成情報](structure-applications.md#application-configurations) の中で、次のようにして構成することが出来ます。
```php
@ -508,7 +544,8 @@ class PostController extends Controller
* [フラグメント・キャッシュ](caching-fragment.md): ウェブ・ページの中の断片をキャッシュすることを可能にします。
* [クライアント・スクリプトの取り扱い](output-client-scripts.md): CSS と JavaScript の登録とレンダリングをサポートします。
* [アセット・バンドルの取り扱い](structure-assets.md): [アセット・バンドル](structure-assets.md) の登録とレンダリングをサポートします。
* [代替のテンプレート・エンジン](tutorial-template-engines.md): [Twig](http://twig.sensiolabs.org/)、[Smarty](http://www.smarty.net/) など、他のテンプレート・エンジンを使用することを可能にします。
* [代替のテンプレート・エンジン](tutorial-template-engines.md): [Twig](http://twig.sensiolabs.org/)、[Smarty](http://www.smarty.net/) など、
他のテンプレート・エンジンを使用することを可能にします。
次に挙げるマイナーではあっても有用な諸機能は、ウェブ・ページを開発するときに頻繁に使用するでしょう。
@ -539,7 +576,8 @@ $this->title = 'My page title';
ウェブ・ページは、通常、いろいろな関係者によって必要とされるさまざまなメタ・タグを生成する必要があります。
ページ・タイトルと同じように、メタ・タグは `<head>` セクションに出現して、通常はレイアウトの中で生成されます。
どのようなメタ・タグを生成するかをコンテント・ビューの中で指定したい場合は、下記のように、[[yii\web\View::registerMetaTag()]] をコンテント・ビューの呼ぶことが出来ます。
どのようなメタ・タグを生成するかをコンテント・ビューの中で指定したい場合は、下記のように、
[[yii\web\View::registerMetaTag()]] をコンテント・ビューで呼ぶことが出来ます。
```php
<?php
@ -547,14 +585,16 @@ $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php'
?>
```
上記のコードは、ビュー・コンポーネントによって "keywords" メタ・タグを登録するものです。登録されたメタ・タグは、レイアウトがレンダリングを完了した後でレンダリングされます。
上記のコードは、ビュー・コンポーネントによって "keywords" メタ・タグを登録するものです。
登録されたメタ・タグは、レイアウトがレンダリングを完了した後でレンダリングされます。
すなわち、レイアウトの中で [[yii\web\View::head()]] を呼び出した場所に、次の HTML コードが生成されて挿入されます。
```php
<meta name="keywords" content="yii, framework, php">
```
[[yii\web\View::registerMetaTag()]] を複数回呼び出した場合は、メタ・タグが同じものか否かに関係なく、複数のメタ・タグが登録されることに注意してください。
[[yii\web\View::registerMetaTag()]] を複数回呼び出した場合は、メタ・タグが同じものか否かに関係なく、
複数のメタ・タグが登録されることに注意してください。
ある型のメタ・タグのインスタンスが一つだけになることを保証したい場合は、このメソッドを呼ぶときに第二のパラメータとしてキーを指定することが出来ます。
例えば、次のコードでは、二つの "description" メタ・タグを登録していますが、二番目のものだけがレンダリングされることになります。
@ -567,8 +607,7 @@ $this->registerMetaTag(['name' => 'description', 'content' => '面白いアラ
### リンク・タグを登録する <span id="registering-link-tags"></span>
[メタ・タグ](#registering-meta-tags) と同じように、リンク・タグも多くの場合において有用なものです。
例えば、favicon をカスタマイズしたり、RSS フィードを指し示したり、OpenID を別のサーバに委任したり、等々。
[メタ・タグ](#registering-meta-tags) と同じように、リンク・タグも多くの場合において有用なものです。例えば、favicon をカスタマイズしたり、RSS フィードを指し示したり、OpenID を別のサーバに委任したり、等々。
リンク・タグも、[[yii\web\View::registerLinkTag()]] を使って、メタ・タグと同じような方法で取り扱うことが出来ます。
例えば、コンテント・ビューにおいて、次のようにしてリンク・タグを登録することが出来ます。
@ -587,7 +626,8 @@ $this->registerLinkTag([
<link title="Yii ライブ・ニューズ" rel="alternate" type="application/rss+xml" href="http://www.yiiframework.com/rss.xml/">
```
[[yii\web\View::registerMetaTag()|registerMetaTag()]] と同じように、[[yii\web\View::registerLinkTag()|registerLinkTag()]] を呼ぶときにキーを指定すると、同じリンク・タグを繰り返して生成するのを避けることが出来ます。
[[yii\web\View::registerMetaTag()|registerMetaTag()]] と同じように、[[yii\web\View::registerLinkTag()|registerLinkTag()]] を呼ぶときにキーを指定すると、
同じリンク・タグを繰り返して生成するのを避けることが出来ます。
## ビューのイベント <span id="view-events"></span>
@ -598,7 +638,8 @@ $this->registerLinkTag([
- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: コントローラでファイルをレンダリングする前にトリガされます。
このイベントのハンドラは、[[yii\base\ViewEvent::isValid]] を `false` にセットして、レンダリングのプロセスをキャンセルすることが出来ます。
- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: ファイルのレンダリングの後、[[yii\base\View::afterRender()]] を呼ぶことによってトリガされます。
このイベントのハンドラは、レンダリング結果をプロパティ [[yii\base\ViewEvent::output]] を通じて取得して、それを修正してレンダリング結果を変更することが出来ます。
このイベントのハンドラは、レンダリング結果をプロパティ [[yii\base\ViewEvent::output]] を通じて取得して、
それを修正してレンダリング結果を変更することが出来ます。
- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: レイアウトの中で [[yii\base\View::beginPage()]] を呼ぶことによってトリガされます。
- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: レイアウトの中で [[yii\base\View::endPage()]] を呼ぶことによってトリガされます。
- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: レイアウトの中で [[yii\web\View::beginBody()]] を呼ぶことによってトリガされます。
@ -615,7 +656,8 @@ $this->registerLinkTag([
## 静的なページをレンダリングする <span id="rendering-static-pages"></span>
静的なページというのは、主たるコンテントのほとんどが静的なもので、コントローラからプッシュされる動的なデータにアクセスする必要がないページを指します。
静的なページというのは、主たるコンテントのほとんどが静的なもので、
コントローラからプッシュされる動的なデータにアクセスする必要がないページを指します。
静的なページは、そのコードをビューに置き、そして、コントローラで次のようなコードを使うと表示することが出来ます。
@ -648,7 +690,8 @@ class SiteController extends Controller
}
```
このようにすると、ディレクトリ `@app/views/site/pages` の下に `about` という名前のビューを作成したときに、次の URL によってこのビューを表示することが出来るようになります。
このようにすると、ディレクトリ `@app/views/site/pages` の下に `about` という名前のビューを作成したときに、
次の URL によってこのビューを表示することが出来るようになります。
```
http://localhost/index.php?r=site%2Fpage&view=about
@ -673,7 +716,8 @@ http://localhost/index.php?r=site%2Fpage&view=about
この目的を達するために、次のテクニックを使うことが出来ます。
* 共通の表示セクション (ページのヘッダやフッタなど) を表すために [レイアウト](#layouts) を使う。
* 複雑なビューはいくつかの小さなビューに分割する。既に説明したレンダリングのメソッドを使えば、小さなビューをレンダリングして大きなビューを組み上げることが出来る。
* 複雑なビューはいくつかの小さなビューに分割する。既に説明したレンダリングのメソッドを使えば、
小さなビューをレンダリングして大きなビューを組み上げることが出来る。
* ビューの構成要素として [ウィジェット](structure-widgets.md) を使う。
* ビューでデータを変換し書式化するためのヘルパ・クラスを作成して使う。

28
docs/guide-ja/structure-widgets.md

@ -1,7 +1,8 @@
ウィジェット
============
ウィジェットは、[ビュー](structure-views.md) で使用される再利用可能な構成ブロックで、複雑かつ構成可能なユーザ・インタフェイス要素をオブジェクト指向のやり方で作成するためのものです。
ウィジェットは、[ビュー](structure-views.md) で使用される再利用可能な構成ブロックで、
複雑かつ構成可能なユーザ・インタフェイス要素をオブジェクト指向の流儀で作成するためのものです。
例えば、日付選択ウィジェットを使うと、入力として日付を選択することを可能にする素敵なデイト・ピッカーを生成することが出来ます。
このとき、あなたがしなければならないことは、次のようなコードをビューに挿入することだけです:
@ -21,7 +22,7 @@ use yii\jui\DatePicker;
## ウィジェットを使う <span id="using-widgets"></span>
ウィジェットは主として [ビュー](structure-views.md) で使われます。
ビューでウィジェットを使うためには、[[yii\base\Widget::widget()]] メソッドを使うことが出来ます。
[[yii\base\Widget::widget()]] メソッドを呼んで、ビューでウィジェットを使います。
このメソッドは、ウィジェットを初期化するための [構成情報](concept-configurations.md) 配列を受け取り、ウィジェットのレンダリング結果を返します。
例えば、下記のコードは、日本語を使い、入力を `$model``from_date` 属性に保存するように構成された日付選択ウィジェットを挿入するものです。
@ -65,7 +66,8 @@ use yii\helpers\Html;
[[yii\base\Widget::widget()]] がウィジェットのレンダリング結果を返すのとは違って、[[yii\base\Widget::begin()]] メソッドがウィジェットのインスタンスを返すことに注意してください。
返されたウィジェットのインスタンスを使って、ウィジェットのコンテントを構築することが出来ます。
> Note: いくつかのウィジェットは、[[yii\base\Widget::end()]] が呼ばれるときに内包されるコンテンツを調整するため、[出力バッファリング](http://php.net/manual/ja/book.outcontrol.php) を使用します。
> Note: いくつかのウィジェットは、[[yii\base\Widget::end()]] が呼ばれるときに囲んだコンテンツを調整するため、
> [出力バッファリング](http://php.net/manual/ja/book.outcontrol.php) を使用します。
> この理由から、[[yii\base\Widget::begin()]] と [[yii\base\Widget::end()]] の呼び出しは、同じビュー・ファイルの中で発生するものと想定されています。
> この規則に従わない場合は、予期しない出力結果が生じ得ます。
@ -78,13 +80,15 @@ use yii\helpers\Html;
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]);
```
詳細については [依存注入コンテナのガイドの "実際の使いかた" のセクション](concept-di-container.md#practical-usage) を参照してください。
詳細については [依存注入コンテナのガイドの "実際の使いかた" のセクション](concept-di-container.md#practical-usage)
を参照してください。
## ウィジェットを作成する <span id="creating-widgets"></span>
ウィジェットを作成するためには、[[yii\base\Widget]] を拡張して、[[yii\base\Widget::init()]] および/または [[yii\base\Widget::run()]] メソッドをオーバーライドします。
通常、`init()` メソッドはウィジェットのプロパティを正規化するコードを含むべきものであり、`run()` メソッドはウィジェットのレンダリング結果を生成するコードを含むべきものです。
ウィジェットを作成するためには、[[yii\base\Widget]] を拡張して、[[yii\base\Widget::init()]] および/または
[[yii\base\Widget::run()]] メソッドをオーバーライドします。
通常、`init()` メソッドはウィジェットのプロパティを初期化するコードを含むべきものであり、`run()` メソッドはウィジェットのレンダリング結果を生成するコードを含むべきものです。
レンダリング結果は、直接に "echo" しても、`run()` の返り値として文字列として返しても構いません。
次の例では、`HelloWidget` が `message` プロパティとして割り当てられたコンテントを HTML エンコードして表示します。
@ -124,7 +128,8 @@ use app\components\HelloWidget;
<?= HelloWidget::widget(['message' => 'おはよう']) ?>
```
下記は `HelloWidget` の変種で、`begin()` と `end()` の間に包まれたコンテントを受け取り、それを HTML エンコードして表示するものです。
下記は `HelloWidget` の変種で、`begin()` と `end()` の間に包まれたコンテントを受け取り、
それを HTML エンコードして表示するものです。
```php
namespace app\components;
@ -148,9 +153,11 @@ class HelloWidget extends Widget
}
```
ご覧のように、`init()` の中で PHP の出力バッファが開始され、`init()` と `run()` の呼び出しの間の全ての出力がキャプチャされ、`run()` の中で処理されて返されます。
ご覧のように、`init()` の中で PHP の出力バッファが開始され、`init()` と `run()` の呼び出しの間の全ての出力がキャプチャされ、
`run()` の中で処理されて返されます。
> Info: [[yii\base\Widget::begin()]] を呼ぶと、ウィジェットの新しいインスタンスが作成され、ウィジェットのコンストラクタの最後で `init()` メソッドが呼ばれます。
> Info: [[yii\base\Widget::begin()]] を呼ぶと、ウィジェットの新しいインスタンスが作成され、
ウィジェットのコンストラクタの最後で `init()` メソッドが呼ばれます。
[[yii\base\Widget::end()]] を呼ぶと、`run()` メソッドが呼ばれて、その返り値が `end()` によって echo されます。
次のコードは、この `HelloWidget` の新しい変種をどのように使うかを示すものです:
@ -196,4 +203,5 @@ public function run()
幸いなことに、Yii はこの問題を解決するのに利用することが出来る [アセット・バンドル](structure-assets.md) のサポートを提供しています。
ウィジェットがビュー・コードだけを含む場合は、[ビュー](structure-views.md) と非常に似たものになります。
実際のところ、この場合、両者の唯一の違いは、ウィジェットが再配布可能なクラスである一方で、ビューはアプリケーション内に保持することが望ましい素の PHP スクリプトである、というぐらいの事です。
実際のところ、この場合、両者の唯一の違いは、ウィジェットが再配布可能なクラスである一方で、
ビューはアプリケーション内に保持することが望ましい素の PHP スクリプトである、というぐらいの事です。

4
docs/guide-ja/test-fixtures.md

@ -20,9 +20,9 @@ Yii のフィクスチャ・フレームワークにおける鍵となる概念
フィクスチャを定義するためには、[[yii\test\Fixture]] または [[yii\test\ActiveFixture]] を拡張して新しいクラスを作ります。
前者は汎用目的のフィクスチャに最も適しています。
一方、後者はデータベースとアクティブレコードを扱うために専用に設計された拡張機能を持っています。
一方、後者はデータベースとアクティブレコードを扱うために専用に設計された拡張機能を持っています。
次のコードは、`User` アクティブレコードとそれに対応するテーブルに関して、フィクスチャを定義するものです。
次のコードは、`User` アクティブレコードとそれに対応するテーブルに関して、フィクスチャを定義するものです。
```php
<?php

10
docs/guide-ja/tutorial-core-validators.md

@ -281,14 +281,14 @@ function foo($model, $attribute) {
]
```
このバリデータは、入力値が [アクティブレコード](db-active-record.md) の属性によって表されるテーブルのカラムに存在するかどうかをチェックします。
`targetAttribute` を使って [アクティブレコード](db-active-record.md) の属性を指定し、`targetClass` によって対応するクラスを指定することが出来ます。
このバリデータは、入力値が [アクティブレコード](db-active-record.md) の属性によって表されるテーブルのカラムに存在するかどうかをチェックします。
`targetAttribute` を使って [アクティブレコード](db-active-record.md) の属性を指定し、`targetClass` によって対応するクラスを指定することが出来ます。
これらを指定しない場合は、検証されるモデルの属性とクラスの値が使用されます。
このバリデータは、一つまたは複数のカラムに対する検証に使用することが出来ます
(複数のカラムに対する検証の場合は、それらの属性の組み合せが存在しなければならないことを意味します)。
- `targetClass`: 検証される入力値を探すために使用される [アクティブレコード](db-active-record.md) クラスの名前。
- `targetClass`: 検証される入力値を探すために使用される [アクティブレコード](db-active-record.md) クラスの名前。
設定されていない場合は、現在検証されているモデルのクラスが使用されます。
- `targetAttribute`: `targetClass` において、入力値の存在を検証するために使用される属性の名前。
設定されていない場合は、現在検証されている属性の名前が使用されます。
@ -644,10 +644,10 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている
```
このバリデータは、入力値がテーブルのカラムにおいてユニークであるかどうかをチェックします。
[アクティブレコード](db-active-record.md) モデルの属性に対してのみ働きます。
[アクティブレコード](db-active-record.md) モデルの属性に対してのみ働きます。
一つのカラムに対する検証か、複数のカラムに対する検証か、どちらかをサポートします。
- `targetClass`: 検証される入力値を探すために使用される [アクティブレコード](db-active-record.md) クラスの名前。
- `targetClass`: 検証される入力値を探すために使用される [アクティブレコード](db-active-record.md) クラスの名前。
設定されていない場合は、現在検証されているモデルのクラスが使用されます。
- `targetAttribute`: `targetClass` において、入力値がユニークであることを検証するために使用される属性の名前。
設定されていない場合は、現在検証されている属性の名前が使用されます。

10
docs/guide-ja/tutorial-performance-tuning.md

@ -41,9 +41,9 @@ Yii によって提供されているキャッシュのサポートについて
## スキーマ・キャッシュを有効にする <span id="enable-schema-caching"></span>
スキーマ・キャッシュは、[アクティブレコード](db-active-record.md) を使おうとする場合には、いつでも有効にすべき特別なキャッシュ機能です。
ご存じのように、アクティブレコードは、賢いことに、あなたがわざわざ記述しなくても、DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。
アクティブレコードはこの情報を取得するために追加の SQL クエリを実行しています。
スキーマ・キャッシュは、[アクティブレコード](db-active-record.md) を使おうとする場合には、いつでも有効にすべき特別なキャッシュ機能です。
ご存じのように、アクティブレコードは、賢いことに、あなたがわざわざ記述しなくても、DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。
アクティブレコードはこの情報を取得するために追加の SQL クエリを実行しています。
スキーマ・キャッシュを有効にすると、取得されたスキーマ情報はキャッシュに保存されて将来のクエリで再利用されるようになります。
スキーマ・キャッシュを有効にするためには、[アプリケーションの構成情報](concept-configurations.md) の中で、`cache` [アプリケーション・コンポーネント](structure-application-components.md) にスキーマ情報を保存するように構成し、[[yii\db\Connection::enableSchemaCache]] を `true` に設定します。
@ -144,8 +144,8 @@ DB クエリのパフォーマンスを向上させるための一般的なテ
## プレーンな配列を使う <span id="using-arrays"></span>
[アクティブレコード](db-active-record.md) は非常に使い勝手のよいものですが、データベースから大量のデータを取得する必要がある場合は、プレーンな配列を使うほどには効率的ではありません。
そういう場合は、アクティブレコードを使ってデータを取得する際に `asArray()` を呼んで、取得したデータがかさばるアクティブレコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。
[アクティブレコード](db-active-record.md) は非常に使い勝手のよいものですが、データベースから大量のデータを取得する必要がある場合は、プレーンな配列を使うほどには効率的ではありません。
そういう場合は、アクティブレコードを使ってデータを取得する際に `asArray()` を呼んで、取得したデータがかさばるアクティブレコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。
例えば、
```php

2
docs/guide-ja/tutorial-yii-as-micro-framework.md

@ -175,7 +175,7 @@ class Post extends ActiveRecord
```
> Info: ここで作成されたモデルは ActiveRecord クラスのもので、`post` テーブルのデータを表します。
> 詳細な情報は [アクティブレコードのガイド](db-active-record.md) を参照してください。
> 詳細な情報は [アクティブレコードのガイド](db-active-record.md) を参照してください。
私たちの API で記事データへのアクセスを提供するために、`controllers` に `PostController` を追加します。

6
docs/guide-ja/tutorial-yii-integration.md

@ -71,7 +71,7 @@ Yii::$classMap['Class2'] = 'path/to/Class2.php';
-------------------------------------
Yii は数多くの優れた機能を提供していますので、サードパーティのシステム (例えば、WordPress、Joomla、または、他の PHP フレームワークを使って開発されるアプリケーション) を開発したり機能拡張したりするのをサポートするために Yii の機能のいくつかを使用したいことがあるでしょう。
例えば、[[yii\helpers\ArrayHelper]] クラスや [アクティブレコード](db-active-record.md) をサードパーティのシステムで使いたいことがあるでしょう。
例えば、[[yii\helpers\ArrayHelper]] クラスや [アクティブレコード](db-active-record.md) をサードパーティのシステムで使いたいことがあるでしょう。
この目的を達するためには、主として、二つのステップを踏む必要があります。
すなわち、Yii のインストールと、Yii のブートストラップです。
@ -118,10 +118,10 @@ new yii\web\Application($yiiConfig); // ここで run() を呼ばない
`run()` を呼ぶと Yii がリクエスト処理のワークフローを制御するようになりますが、この場合はリクエストを処理する別のアプリケーションが既に存在していますので、これは必要ではないからです。
Yii アプリケーションでの場合と同じように、サードパーティ・システムが走っている環境に基づいて Yii のアプリケーション・インスタンスを構成する必要があります。
例えば、[アクティブレコード](db-active-record.md) の機能を使うためには、サードパーティ・システムによって使用されている DB 接続の設定を使って `db` [アプリケーション・コンポーネント](structure-application-components.md) を構成しなければなりません。
例えば、[アクティブレコード](db-active-record.md) の機能を使うためには、サードパーティ・システムによって使用されている DB 接続の設定を使って `db` [アプリケーション・コンポーネント](structure-application-components.md) を構成しなければなりません。
これで、Yii によって提供されているほとんどの機能を使うことが出来ます。
例えば、アクティブレコード・クラスを作成して、それを使ってデータベースを扱うことが出来ます。
例えば、アクティブレコード・クラスを作成して、それを使ってデータベースを扱うことが出来ます。
Yii 2 を Yii 1 とともに使う <span id="using-both-yii2-yii1"></span>

Loading…
Cancel
Save